springmvc框架 基于aop 实现的 自定义注解 的权限校验

 这是用户对应权限的数据设计  用户对应 角色 角色 对应 接口标识 接口标识是控制层每个接口的标识

切面类  根据用户id获取 这个用户的权限 然后权限对应的接口标识集合premsList  然后再去获取增强目标方法的接口标识prems  再判断这个接口标识集合premsList 里目标方法上的接口标识  没有权限就抛异常

/**
 * 鉴权功能
 *
 * @Date:2024-01-22 11:41
 * @Author:ye
 */
@Aspect
@Component
public class AuthorizationAspect {
    @Autowired
    private OfficeLoginService officeLoginService;

    @Before("@annotation(requirePermission)")
    public void checkAuthorization(RequirePermission requirePermission) {
        // 获取需要校验的权限名称
        String permissionName = requirePermission.value();


        // 进行权限校验逻辑
        if (!hasPermission(permissionName)) {
            throw new SecurityException("没有访问权限");
        }
        System.out.println("测试");
    }

    /**
     *  返回true表示有权限,返回false表示无权限
     *
     * @Date:2024-01-22 13:40
     * @Author:ye
     */
    private boolean hasPermission(String permissionName) {

        List<String> securityList = officeLoginService.getSecurityByUserId(AuthenticationContext.get().getUserId());
        return securityList.stream()
                .anyMatch(security -> security.equals(permissionName));
    }


}

 接下来是自定义注解 这个没啥好说的  cv就完事了

/**
 * 鉴权注解
 *
 * @Date:2024-01-22 11:41
 * @Author:ye
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequirePermission {
    String value();  // 权限名称
}

 配置文件  还是有说法的  一般aop很少写在控制 层 一般都是 读service层的业务进行增强 所以  因为种种原因 需要在springmvc加上这个配置才能生效 原因可以查看我发的这个链接我水平有限看不太懂 springmvc aop配置不生效的原因

 springmvc.xml

<!--    控制层的aop配置-->
<aop:aspectj-autoproxy proxy-target-class="true"/>

 spirng.xml

 

<!-- 开启AOP支持 -->
<aop:aspectj-autoproxy />
<context:component-scan base-package="com.xtql.office.role" />
<!-- 定义权限校验切面 -->
<bean id="authorizationAspect" class="com.xtql.office.role.AuthorizationAspect" />

 最后只需要在控制层的接口上 加上 注解 然后接口标识就能实现功能了

 

/**
 * 部门选项查询
 *
 * @author 
 * @date 2024-01-11
 */
@RequestMapping("/getAllDepartment")
@ResponseBody
public String getAllDepartment() {
 
}

 做简易 的鉴权 还可以使用拦截器 实现的和这个大差不差  在拦截器中获取目标方法的 请求路径  所以数据库里权限就是和请求路径绑定  然后在拦截器取出登录用户id 比较  数据库里数据的数据 看看 数据库里这个用户对应有无 目标方法路径的数据(如果有需要可以私信我 我写个拦截器鉴权的demo案例)  两者原理都是 在对控制层的请求之前 先获取用户id 然后根据用户id结合数据库判断权限  如果无权限 直接抛异常 结束这次请求

  • 28
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值