业务场景:
Shiro权限校验
RequiresPermissions标签是优先获取方法上的注解信息,再从类上注解获取权限标识符
但是系统的 XxxController 层是继承的 BaseController,增删改查方法,在BaseController中,无法对增删改查的 RequiresPermissions 权限标签进行自定义
逻辑分析:
1、aop 切面拦截 controller 对应调用的方法
2、获取对应方法的注解信息
3、使用对应的解析器解析获取到的注解信息
①、获取方法注解信息
②、获取类注解信息
③、返回注解信息
4、从注解获取权限标识符根据以下代码分析,从注解解析器入手,进行拦截处理
实现效果:
支持 controller类上注解 和 method 上 RequiresPermissions 注解的value值进行拼接
* “@RequiresPermissions("customer:info:")”
* XxController{
* “@RequiresPermissions("save")”
* public void save() {
* }
* }
* 最终权限标识符 ”customer:info:save”
最终实现相关代码
一、shiro配置类
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.session.mgt.SessionManager;
@Configuration
public class ShiroConfig {
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
advisor.setAdvice(new AopAllianceAnnotationsAuthorizingMethodInterceptorExtend());
return advisor;
}
}
二、注解解析器
import org.apache.shiro.aop.MethodInvocation;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.spring.aop.SpringAnnotationResolver;
import org.springframework.core.annotation.AnnotationUtils;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.List;
/**
* ShiroAnnotationResolver
*
* @author HHKJ-SERVER-ZJ
* @since 2023/4/24 13:18
*/
public class ShiroAnnotationResolver extends SpringAnnotationResolver {
/** 开放标识,以此标识为例,如果Controller上添加注解,而方法需要开放权限,使用该标识判断是否为开放接口信息 */
public static final String OPEN_VALUE = "OPEN";
@Override
public Annotation getAnnotation(MethodInvocation mi, Class<? extends Annotation> clazz) {
// 对 RequiresPermissions 注解进行单独处理
if (clazz == RequiresPermissions.class) {
return getRequiresPermissionsAnnotation(mi);
}
return super.

博客围绕Shiro权限校验展开,指出RequiresPermissions标签在系统XxxController层继承BaseController时,无法对增删改查权限标签自定义的问题。通过aop切面拦截、获取注解信息、解析注解等步骤,从注解解析器入手进行拦截处理,并给出了shiro配置类和注解解析器的最终实现代码及思路分析。

被折叠的 条评论
为什么被折叠?



