shiro标签权限管理
功能:只有管理员能看到智能归档的菜单,普通用户看不到。由于有单点登录系统先判断用户账号和密码,所以此处不需要role角色表,仅需要判断用户及其权限。
如下图可见,该菜单是一个a标签,我们需要借助shiro的标签权限进行管理
构建步骤:
1、本项目前端采用freemarker,所以添加shiro-freemarker的依赖
<!-- freemarker + shiro(标签) begin -->
<dependency>
<groupId>net.mingsoft</groupId>
<artifactId>shiro-freemarker-tags</artifactId>
<version>0.1</version>
</dependency>
<!-- freemarker + shiro(标签) end -->
2、FreeMarkerConfigExtend类添加freemarker的shiro标签,这样freemarker才能添加shiro标签
public class FreeMarkerConfigExtend extends FreeMarkerConfigurer {
@Override
public void afterPropertiesSet() throws IOException, TemplateException {
super.afterPropertiesSet();
Configuration cfg = this.getConfiguration();
// 添加shiro标签
cfg.setSharedVariable("shiro", new ShiroTags());
}
}
3、SpringMvc 需要更改下freemarker是视图解析器,将bean的id为freemarkerConfig的class改为我上面创建的FreeMarkerConfigExtend类
4、在页面上加shiro标签
<@shiro.hasPermission name="init">
<li class="treeview">
<a href="#">
<i class="fa fa-dashboard"></i> <span>智能归档</span>
<span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i>
</span>
</a>
</li>
</@shiro.hasPermission>
5、数据库permission权限表的菜单名根据页面的name配置,user表与之建立关系。
流程总结:
当刷新页面的时候,页面检测到标签,会被realm的doGetAuthorizationInfo方法拦截。由userName获取该用户的数据库中设置的权限,与标签的权限进行对比,例如此处标签是需要这个init权限才能看到内容,那么如果用户数据库中没有这个权限,就会不显示。
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//能进入到这里,表示账号已经通过验证了
String userName =(String) principalCollection.getPrimaryPrincipal();
//通过service获取角色和权限
Set<String> permissions = permissionService.listPermissions(userName);
//授权对象
SimpleAuthorizationInfo s = new SimpleAuthorizationInfo();
//把通过service获取到的角色和权限放进去
s.setStringPermissions(permissions);
return s;
}