如何想在 FreeMarker 的 ftl 模板文件里直接调用 shiro 的标签,需要添加依赖,并做简单的配置,下面简单介绍下,本文是建立在 SpringBoot + FreeMarker + Shiro 已经整合完成下,介绍 Shiro FreeMarker 标签的使用。
1.添加依赖
2.FreeMarker 配置
主要看43-44行
1.guest(游客)
2.user(已经登录,或者记住我登录)
3.authenticated(已经认证,排除记住我登录的)
4.notAuthenticated(和authenticated相反)
这个功能主要用途,识别是不是本次操作登录过的,比如支付系统,进入系统可以用记住我的登录信息,但是当要关键操作的时候,需要进行认证识别。
5.principal标签,这个要稍微重点讲讲。好多博客都是一下带过。
principal标签,取值取的是你登录的时候。在Realm实现类中的如下代码:
6.hasRole标签(判断是否拥有这个角色)
7.hasAnyRoles标签(判断是否拥有这些角色的其中一个)
8.lacksRole标签(判断是否不拥有这个角色)
9.hasPermission标签(判断是否有拥有这个权限)
10.lacksPermission标签(判断是否没有这个权限)
一、整合 freeMarker-shiro 标签
1.添加依赖
- <!--Shiro-FreeMarker标签-->
- <dependency>
- <groupId>net.mingsoft</groupId>
- <artifactId>shiro-freemarker-tags</artifactId>
- <version>0.1</version>
- </dependency>
2.FreeMarker 配置
- package com.liuyanzhao.sens.config;
- import com.jagregory.shiro.freemarker.ShiroTags;
- import com.liuyanzhao.sens.model.tag.CommonTagDirective;
- import com.liuyanzhao.sens.service.OptionsService;
- import freemarker.template.TemplateModelException;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.context.annotation.Configuration;
- import javax.annotation.PostConstruct;
- /**
- * <pre>
- * FreeMarker配置
- * </pre>
- *
- * @author : saysky
- * @date : 2018/4/26
- */
- @Slf4j
- @Configuration
- public class FreeMarkerConfig{
- @Autowired
- private freemarker.template.Configuration configuration;
- @Autowired
- private OptionsService optionsService;
- @Autowired
- private CommonTagDirective commonTagDirective;
- @PostConstruct
- public void setSharedVariable() {
- try {
- //自定义标签
- configuration.setSharedVariable("commonTag", commonTagDirective);
- configuration.setSharedVariable("options", optionsService.findAllOptions());
- //shiro标签
- configuration.setSharedVariable("shiro", new ShiroTags());
- configuration.setNumberFormat("#");
- } catch (TemplateModelException e) {
- log.error("自定义标签加载失败:{}", e.getMessage());
- }
- }
- }
主要看43-44行
二、标签的使用
1.guest(游客)
- <@shiro.guest>
- 您当前是游客,<a href="javascript:void(0);" class="dropdown-toggle qqlogin" >登录</a>
- </@shiro.guest>
2.user(已经登录,或者记住我登录)
- <@shiro.user>
- 欢迎[<@shiro.principal/>]登录,<a href="/logout">退出</a>
- </@shiro.user>
3.authenticated(已经认证,排除记住我登录的)
- <@shiro.authenticated>
- 用户[<@shiro.principal/>]已身份验证通过
- </@shiro.authenticated>
4.notAuthenticated(和authenticated相反)
- <@shiro.notAuthenticated>
- 当前身份未认证(包括记住我登录的)
- </@shiro.notAuthenticated>
这个功能主要用途,识别是不是本次操作登录过的,比如支付系统,进入系统可以用记住我的登录信息,但是当要关键操作的时候,需要进行认证识别。
5.principal标签,这个要稍微重点讲讲。好多博客都是一下带过。
principal标签,取值取的是你登录的时候。在Realm实现类中的如下代码:
- ....
- return new SimpleAuthenticationInfo(user,user.getPswd(), getName());
- 在new SimpleAuthenticationInfo(第一个参数,....)的第一个参数放的如果是一个username,那么就可以直接用。
- <!--取到username-->
- <@shiro. principal/>
- 如果第一个参数放的是对象,比如我喜欢放User对象。那么如果要取username字段。
- <!--需要指定property-->
- <@shiro.principal property="username"/>
- 和Java如下Java代码一致
- User user = (User)SecurityUtils.getSubject().getPrincipals();
- String userusername = user.getUsername();
6.hasRole标签(判断是否拥有这个角色)
- <@shiro.hasRole name="admin">
- 用户[<@shiro.principal/>]拥有角色admin<br/>
- </@shiro.hasRole>
7.hasAnyRoles标签(判断是否拥有这些角色的其中一个)
- <@shiro.hasAnyRoles name="admin,user,member">
- 用户[<@shiro.principal/>]拥有角色admin或user或member<br/>
- </@shiro.hasAnyRoles>
8.lacksRole标签(判断是否不拥有这个角色)
- <@shiro.lacksRole name="admin">
- 用户[<@shiro.principal/>]不拥有admin角色
- </@shiro.lacksRole>
9.hasPermission标签(判断是否有拥有这个权限)
- <@shiro.hasPermission name="user:add">
- 用户[<@shiro.principal/>]拥有user:add权限
- </@shiro.hasPermission>
10.lacksPermission标签(判断是否没有这个权限)
- <@shiro.lacksPermission name="user:add">
- 用户[<@shiro.principal/>]不拥有user:add权限
- </@shiro.lacksPermission>
2019年10月08日 22:47:03
评论测试!
2019年02月09日 02:19:04
12132好
2019年02月01日 21:11:52
技术牛叉