基于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)

主要思想,由于资源是不会变的,我们给角色或者用户分配资源权限后,直接在拦截器里面进行资源权限的校验即可。且有变动的时候基本上不需要改动代码。

用户登录的后把用户的资源权限查出来放到redis里面

实现方式依旧:自定义注解+拦截器

自定义注解
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface HasResourcePermission {
String value() default "";
}
SpringMVC拦截器
@Component
public class RequestInterceptor implements HandlerInterceptor {
@Resource
private RedisTemplate<String,Object> redisTemplate; @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
if (handlerMethod.hasMethodAnnotation(HasResourcePermission.class)) {
String resourcePermissionSign = handlerMethod.getMethodAnnotation(HasResourcePermission.class).value();
Object resourcePermission = redisTemplate.opsForValue().get("resourcePermission");
List<String> resourcePermissionList = (List<String>) resourcePermission;
if (resourcePermissionList.contains(resourcePermissionSign)) {
// 不符合条件,可以抛自定义异常,给客户端提示信息
return false;
}
}
}
return true;
}
}

注意:最后要把拦截器加入到配置里面

基本上就是这样了,也可以根据需求再改,关于数据库表业务会需要加上用户组表的信息。

基于RBAC实现权限管理的更多相关文章

  1. devops-jenkins基于角色的权限管理RBAC

    一. devops-jenkins基于角色的权限管理RBAC 1 安装角色的rbac角色管理  1.1) 点击系统管理 1.2) 选择插件管理 1.3) 选择可选插件,输入role搜索 1.4) 选择 ...

  2. 基于DDDLite的权限管理OpenAuth.net 1.0版正式发布

    距离上一篇OpenAuth.net的文章已经有5个多月了,在这段时间里项目得到了很多朋友的认可,开源中国上面的Star数接近300,于是坚定了我做下去的信心.最近稍微清闲点,正式推出1.0版,并在阿里 ...

  3. 10.spring-boot基于角色的权限管理页面实现

    10.spring-boot基于角色的权限管理页面实现

  4. 【shiro】(5)---基于Shiro的权限管理

    基于Shiro的权限管理项目搭建 前面写了四篇有关权限的文章,算是这篇文章的铺垫了.这篇文章采用 开发环境           JDK1.8          Eclipse          Mav ...

  5. 【shiro】(2)---基于RUL的权限管理

    基于RUL的权限管理 我想在写shiro权限管理认证前,先来一个基于URL实现的权限管理控制. 一.基于URI的权限业务逻辑  实现思路:       将系统操作的每个url配置在权限表中,将权限对应 ...

  6. 基于云端的通用权限管理系统,SAAS服务,基于SAAS的权限管理,基于SAAS的单点登录SSO,企业单点登录,企业系统监控,企业授权认证中心

    基于云端的通用权限管理系统 SAAS服务 基于SAAS的权限管理 基于SAAS的单点登录SSO 基于.Net的SSO,单点登录系统,提供SAAS服务 基于Extjs 4.2 的企业信息管理系统 基于E ...

  7. Spring Security实现基于RBAC的权限表达式动态访问控制

    昨天有个粉丝加了我,问我如何实现类似shiro的资源权限表达式的访问控制.我以前有一个小框架用的就是shiro,权限控制就用了资源权限表达式,所以这个东西对我不陌生,但是在Spring Securit ...

  8. 权限管理系统(五):RBAC新解,基于资源的权限管理

    本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的.同时我将讨论一种我认为更好的权限管理方式. 1.什么是角色 当说到程序的权限管理时,人们往往想到角色这一概念.角色是 ...

  9. RBAC基于角色的权限管理模型

    一.权限管理模型的必要性: a. 安全性:防止误操作,防止数据泄露,保证信息的安全. b. 数据隔离:保持不同的角色具有不同的权限,只能看到自己权限范围内的数据 二.权限管理模型的发展: a. 传统的 ...

随机推荐

  1. linux下php安装php-kafka扩展和php-rdkafka扩展

    具体步骤: 1.安装librdkafka cd /usr/local/src  #进入安装包存放目录 wget https://github.com/edenhill/librdkafka/archi ...

  2. Java9系列第6篇-Stream流API的增强

    我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...

  3. 为什么堆化 heapify() 只用 O(n) 就做到了?

    heapify() 前面两篇文章介绍了什么是堆以及堆的两个基本操作,但其实呢,堆还有一个大名鼎鼎的非常重要的操作,就是 heapify() 了,它是一个很神奇的操作, 可以用 O(n) 的时间把一个乱 ...

  4. 第五章 NFS、rsync等统一用户相关操作

    一.统一用户 1.httpd2.NFS挂载目录3.rsync 1.所有服务器统一创建用户 [root@web01 ~]# groupadd www -g 666[root@web01 ~]# user ...

  5. python第二章:控制流

    变成实际上是一个过程的提现,每个过程都是有多个流程块组成. 比如:判断是否下雨的过程 1.布尔值 在第一章最后举例了比较操作后,最终返回的结果 True or False True 和 False是一 ...

  6. 如何发布代码到maven中心仓库

    deploy to sonatype 参考文章 https://blog.csdn.net/xuefu_78/article/details/52494698 https://blog.csdn.ne ...

  7. win32之临界区

    线程安全问题 每个线程都有自己的栈,而局部变量是存储在栈中的,这就意味着每个线程都有一份自己的"局部变量",如果线程 仅仅使用 "局部变量" 那么就不存在线程安 ...

  8. Redis---09Redis集群(二)

    一.集群的Jedis开发: 1.导入jar包 jedis-2.8.1.jar commons-pool2-2.4.2.jar 2.代码 public class TestCluster { publi ...

  9. Rancher 2.5特性解读丨更简单友好的API和Dashboard

    本文来自Rancher Labs 关注我们,看K8S干货教程 作者简介 张智博,Rancher中国研发与产品总监.7年云计算领域经验,一直活跃在研发一线,经历了OpenStack到Kubernetes ...

  10. 2020 10月CUMTCTF wp

    华为杯 × 签到杯√ 论比赛过程来说没什么很大收获 但看师傅们的wp感触很多 赛后复现慢慢学吧 Web babyflask flask ssti模板注入: payload{{key}}发现[]以及类似 ...