说到权限的时候首先要了解RBAC,用户 角色 权限之前的关系,方便系统维护 大数据量的用户
1.实现步骤
设计表 因为是小项目用到四张就可以了 用户表 权限表 和角色表就行了
因为角色和权限是一对多的关系,所以permission字段是String类型就可以了
2.切权限注解@Aspect注解去切注解 如果不知道Aspect的含义建议去百度一下
根据实际业务去选择注解切割 这里我用的是around环绕通知去切,利用 Annotation的反射机制去切到value值,他执行方法是会去调这个类,这里去比对是否符合权限
- 使用 ProceedingJoinPoint 获取参数信息
- 使用joinPoint.proceed()方法调用方法。
- 只有调用上面的方法才能够执行方法
@Aspect @Component public class PreAuthorizeAspect { @Autowired private PermissionService permissionService; //@Pointcut("execution(* cn.abtu.controller.*.*(..))") @Pointcut("@annotation(cn.abtu.security.Permission)") public void acpectMethod(){ } @Around("acpectMethod()&&@annotation(permission)") public Object doAround(ProceedingJoinPoint joinPoint, Permission permission) throws Throwable { // 接收到请求,记录请求内容 String value = permission.value(); LoginUser loginUser = SecurityUtils.getLoginUser(); System.err.println(permissionService.hasPermi(value)); if(!loginUser.getIsSupper()&&!permissionService.hasPermi(value)){ // 如果不是超级管理员并且没有权限 throw new BusinessException(HttpStatus.UNAUTHORIZED, "暂无权限,请联系管理员!"); } return joinPoint.proceed(); } }
3.简单的看一个方法权限注解放置的位置
/** * 获取管理员列表 * * @param role 角色id,0表示超级管理员 * @param nick 昵称(可模糊) * @param account 账号(可模糊) * @param pageNum 页码 * @param pageSize 页码大小 * @return */ @GetMapping("/list") @Permission("admin:get") public AjaxResult list( @RequestParam Integer role, @RequestParam(required = false) String nick, @RequestParam(required = false) String account, @RequestParam Integer pageNum, @RequestParam Integer pageSize ) { startPage(); Admin admin=new Admin(); admin.setNick(nick); admin.setRole(role); admin.setAccount(account); QueryWrapper<Admin> queryWrapper = new QueryWrapper<>(admin); return getDataTable(adminService.list(queryWrapper)); }
4.自定义权限类
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Inherited public @interface Permission { /** * @return the Spring-EL expression to be evaluated before invoking the protected * method */ String value(); }
5. permissionService.hasPermi(value)校验用户是否有权限
/** * 验证用户是否具备某权限 * * @param permission 权限字符串 * @return 用户是否具备某权限 */ public boolean hasPermi(String permission) { if (StringUtils.isEmpty(permission)) { return false; } LoginUser loginUser = SecurityUtils.getLoginUser(); if (StringUtils.isNull(loginUser)) { return false; } // 超级管理员放行 if(loginUser.getIsSupper()){ return true; } if(CollectionUtils.isEmpty(loginUser.getPermissions())){ return false; } //PermissionContextHolder.setContext(permission); return hasPermissions(loginUser.getPermissions(), permission); //return true; }
6. 后续只有根据具体业务需求去对应角色加权限就行了.