这是用户对应权限的数据设计 用户对应 角色 角色 对应 接口标识 接口标识是控制层每个接口的标识
切面类 根据用户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结合数据库判断权限 如果无权限 直接抛异常 结束这次请求