七 SpringBoot集成Shiro鉴权
1 Shiro 鉴权三种方式
编程式 通过写 if/else 授权代码块完成
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole("hr")) {
//有权限
} else {
//无权限
}
注解式 通过在controller的方法上放置相应的注解完成(shiro已经做好了,直接贴就行)
@RequiresRoles("hr")
@RequiresPermissions("user:create")
// 设置多个权限是否同时需要,或者只有其中一种即可
// @RequiresPermissions(value={"user:create","user:delete"},logical=logical.OR)
public void addUser(User user) {
//有权限
}
JSP标签(shiro自带) 、Freemarker的标签(第三方) 、ThymeLeaf的标签(第三方)在页面通过相应的标签完成,ThymeLeaf标签文档,通过标签完成有权限显示,无权限不显示。
<a shiro:hasRole="administrator" href="admin.html">Administer the system</a>
<a shiro:hasPermission="user:create" href="createUser.html">Create a new User</a>
2 Shiro 拦截方法流程
3 支持注解鉴权配置
需要ShiroConfig中配置Shiro注解通知器Bean(当看到注解后通知SecurityManager进行权限认证),与支持CGLIB的Bean
// 开启Shiro注解通知器
// Qualifier(起别名)此处 SecurityManager 可能报错,因为lang包是自动导入的
// 所以此处的 SecurityManager 是lang包下的,我们需要的是Shiro包下的 SecurityManager 可使用acap.xx.xx.xx.SecurityManager 这种方式,
// 或者使用之前定义的安全管理器类型 DefaultWebSecurityManager 防止自动导包
// public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(
// DefaultWebSecurityManager securityManager){}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(
@Qualifier("securityManager") SecurityManager securityManager)
{
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
// 设置支持CGlib代理
@Bean
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
return advisorAutoProxyCreator;
}
4 完善Realm的授权方法
在Apache Shiro中,SimpleAuthorizationInfo 并不直接与 Subject 关联。相反,SimpleAuthorizationInfo 是用于封装授权信息(如角色和权限