Version: Next
Shiro整合模板引擎
Freemarker
需求: 根据当前用户所具有的权限,显示对应的内容,没权限的操作直接不给用户显示,只显示有权限的操作
- Maven 坐标
<dependency>
<groupId>net.mingsoft</groupId>
<artifactId>shiro-freemarker-tags</artifactId>
<version>0.1</version>
</dependency>
- Freemarker配置类
@Component
public class FreemarkerComponent {
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
@PostConstruct
public void setSharedVariable() throws TemplateModelException {
freeMarkerConfigurer.getConfiguration().setSharedVariable("shiro", new ShiroTags());
}
}
- 在freemarker ftl页面上使用shiro标签
- index.ftl
<body>
首页<br>
<#if msg??><p style="color:red">${msg}</p></#if>
<hr>
<@shiro.hasPermission name="user:add">
<a href="/user/add">add</a>
</@shiro.hasPermission>
<@shiro.hasPermission name="user:update">
<a href="/user/update">update</a>
</@shiro.hasPermission>
</body>
测试
- bb具有
user:add
权限,他的主页只能看到add链接 - root具有
user:update
权限,他的主页只能看到update链接
所有freemarker shiro标签
- 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.shtml">退出</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 username = 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>
测试——没登录时显示登录按钮
<@shiro.notAuthenticated>
<h1><a href="/user/toLogin">登录</a> </h1>
</@shiro.notAuthenticated>