如何通过RBAC实现权限管理?

摘要:基于RBAC实现权限管理 技术栈:SpringBoot、SpringMVC RBAC RBAC数据库表 主体 编号 账号 密码 001 admin 123456 资源 编号 资源名称 访问路径 001 查询用户列表 userlist 权
基于RBAC实现权限管理 技术栈:SpringBoot、SpringMVC RBAC RBAC数据库表 主体 编号 账号 密码 001 admin 123456 资源 编号 资源名称 访问路径 001 查询用户列表 /user/list 权限 编号 权限标识 权限名称 资源编号 001 user:list 查看用户列表 001 角色 角色编号 角色名称 001 管理员 用户角色 编号 角色编号 用户编号 001 001 001 角色权限 编号 角色编号 权限编号 001 001 001 可以进行一些合并,优化表数量 将资源表和权限表进行合并为权限表 权限 编号 权限标识 权限名称 资源名称 资源访问地址 001 user:list 查询用户列表 用户列表 /user/list 基于角色的访问控制(Role-Based Access Control) 主要思想就是访问后台接口的时候判断该用户的角色是否为某某角色,是的话就放行,否则就拒绝访问。 这里我用的jwt,token里存储的由用户角色(ADMIN) 实现方式:自定义注解+拦截器 自定义注解 @Target({ElementType.METHOD}) //注解作用域方法上 @Retention(RetentionPolicy.RUNTIME) //编译器将注解信息存储与class文件中,由JVM读取 @Documented public @interface HasRole { String[] value() default {}; } SpringMVC拦截器 @Component public class AccessControlInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; if (handlerMethod.hasMethodAnnotation(HasRole.class)) { // 从request中获取token // 解析token获取claims // claims就是个map,直接获取用户角色 String role = claims.get("userRole"); String[] hasRole = handlerMethod.getMethodAnnotation(HasRole.class).value(); boolean contains = Arrays.asList(hasRole).contains(role); if(!contains){ // 不符合条件,可以抛自定义异常,给客户端提示信息 return false; } } } return true; } } 注意:最后要把拦截器加入到配置里面 这种方式很简单,应对简单的需求很实用,但是复杂的就行不通了 基于资源的访问控制(Resource-Based Access Control) 主要思想,由于资源是不会变的,我们给角色或者用户分配资源权限后,直接在拦截器里面进行资源权限的校验即可。且有变动的时候基本上不需要改动代码。
阅读全文