重写Shiro,拦截RequiresPermissions权限标识获取逻辑,实现Controller多级权限拼接

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

业务场景:
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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值