用户认证+授权后,就可以进行接口权限控制。方法是拿用户(已授予的)权限与接口所需权限进行比较,不包含则视为无权。在shiro中,授权校验可以通过以下方式实现:
(1)自定义拦截器或者AOP,通过对需要鉴权的接口做拦截,参照拦截器与过滤器(三)拦截自定义Annotation注解_@annotation 拦截类注解-CSDN博客
(2)注解式授权校验
注解式授权拦截只能用于方法,用在类头上无效;项目支持拦截式注解的前提是开启了aop
<!-- AOP依赖,必须,否则shiro权限拦截验证不生效 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
//以下为注解支持配置
/**
* Shiro生命周期处理器
*/
@Bean(name = "lifecycleBeanPostProcessor")
public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
/**
* 开启Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP扫描使用Shiro注解的类,并在必要时进行安全逻辑验证
*/
@Bean
@DependsOn("lifecycleBeanPostProcessor")
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
return advisorAutoProxyCreator;
}
/**
* 开启Shiro-aop注解支持
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
常见的注解式授权有:
一、@RequiresAuthentication:
1、作用:要求当前Subject已经在session中验证通过(验证当前用户是否登录: subject.isAuthenticated() 结果为true)
二、@RequiresUser:
验证用户是否被记忆
三、@RequiresGuest:
用户没有登录认证或被记住过,验证是否是一个guest的请求,与@RequiresUser完全相反。换言之,RequiresUser == !RequiresGuest。此时subject.getPrincipal() 结果为null.
四、@RequiresRoles:
验证当前用户是否具有某角色,与验证权限类似
五、@RequiresPermissions:
验证用户是否具有一个或多个权限,该注解经常在项目中使用,如果不满足条件则抛出AuthorizationException异常。
1、单权限:
@RequiresPermissions("school_manage")
2、多权限:权限值value用数组代替,再设置logical
(1)符合一个即可:logical = Logical.OR,如
@RequiresPermissions(value = { "menu_1", "mneu_2" }, logical = Logical.OR)
(2)必须全部符合:logical = Logical.AND,如
@RequiresPermissions(value = { "menu_1", "mneu_2" }, logical = Logical.AND)