基于RBAC实现权限管理
基于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实现权限管理的更多相关文章
- devops-jenkins基于角色的权限管理RBAC
		
一. devops-jenkins基于角色的权限管理RBAC 1 安装角色的rbac角色管理 1.1) 点击系统管理 1.2) 选择插件管理 1.3) 选择可选插件,输入role搜索 1.4) 选择 ...
 - 基于DDDLite的权限管理OpenAuth.net 1.0版正式发布
		
距离上一篇OpenAuth.net的文章已经有5个多月了,在这段时间里项目得到了很多朋友的认可,开源中国上面的Star数接近300,于是坚定了我做下去的信心.最近稍微清闲点,正式推出1.0版,并在阿里 ...
 - 10.spring-boot基于角色的权限管理页面实现
		
10.spring-boot基于角色的权限管理页面实现
 - 【shiro】(5)---基于Shiro的权限管理
		
基于Shiro的权限管理项目搭建 前面写了四篇有关权限的文章,算是这篇文章的铺垫了.这篇文章采用 开发环境 JDK1.8 Eclipse Mav ...
 - 【shiro】(2)---基于RUL的权限管理
		
基于RUL的权限管理 我想在写shiro权限管理认证前,先来一个基于URL实现的权限管理控制. 一.基于URI的权限业务逻辑 实现思路: 将系统操作的每个url配置在权限表中,将权限对应 ...
 - 基于云端的通用权限管理系统,SAAS服务,基于SAAS的权限管理,基于SAAS的单点登录SSO,企业单点登录,企业系统监控,企业授权认证中心
		
基于云端的通用权限管理系统 SAAS服务 基于SAAS的权限管理 基于SAAS的单点登录SSO 基于.Net的SSO,单点登录系统,提供SAAS服务 基于Extjs 4.2 的企业信息管理系统 基于E ...
 - Spring Security实现基于RBAC的权限表达式动态访问控制
		
昨天有个粉丝加了我,问我如何实现类似shiro的资源权限表达式的访问控制.我以前有一个小框架用的就是shiro,权限控制就用了资源权限表达式,所以这个东西对我不陌生,但是在Spring Securit ...
 - 权限管理系统(五):RBAC新解,基于资源的权限管理
		
本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的.同时我将讨论一种我认为更好的权限管理方式. 1.什么是角色 当说到程序的权限管理时,人们往往想到角色这一概念.角色是 ...
 - RBAC基于角色的权限管理模型
		
一.权限管理模型的必要性: a. 安全性:防止误操作,防止数据泄露,保证信息的安全. b. 数据隔离:保持不同的角色具有不同的权限,只能看到自己权限范围内的数据 二.权限管理模型的发展: a. 传统的 ...
 
随机推荐
- 前端基础——HTML(二)
			
HTML标签 标题标签<h1>.<h2>.<h3>.<h4>,标题标签之间是不能嵌套的,下一级标题与上级标题之间通过同级 关于书写,下级标题解释说明的是 ...
 - vue 404
			
问题描述:前端同事使用Vue.js框架,利用vue-route结合webpack编写了一个单页路由项目,运维协助在服务器端配置nginx.部署完成后,访问首页没问题,从首页里打开二级页面没问题,但是所 ...
 - 【源码】spring循环引用
			
spring在单例,非构造方法注入的情况下允许循环依赖 1.循环依赖 a引用b,b引用a.a创建的时候需要b,但是b没有创建,需要先去创建b,b创建的时候又没有a,这就出现的循环依赖的问题 2.为什么 ...
 - Mybatis入门 Mybatis存在的意义 解决的问题 基本操作
			
Mybatis入门 Mybatis的作用 解决的问题 基本操作 为什么要学MyBatis 我们链接操作数据库需要做的步骤 package Test; import java.sql.*; public ...
 - LuoguP3602 Koishi Loves Segments
			
题面 n个区间和数轴上的m个关键点 (0<=n,m<=4*1e5,数轴范围 \(-1^7\) ~ \(1^7\))每个关键点有被区间区间覆盖的次数上限,求最多能放多少个区间到数轴上 传送门 ...
 - JAVA类库之——Character类(持续更新)
			
Character 类 目录 Character 类 判断该字符是不是一个数字的方法:isDigit(ch) 判断该字符是不是一个字母的方法:isLetter(ch) 判断该字符是不是一个数字或字母的 ...
 - JVM详解(二)-- 第2章 类加载器子系统
			
一.JVM内存结构 1.1 内存结构---概略图 1.2 内存结构--详细图 二.类加载器子系统的作用 类加载器子系统负责从文件系统或网络中加载.Class文件,文件需要有特定的标识(cafe bab ...
 - nb-iot技术能自组网吗
			
NB-IoT是运营商主导的网络,运营在授权频段上,LoRa运营在开放频段上,可以由企业自主建设.NB-IoT构建于蜂窝网络,只消耗大约180KHz的带宽,可直接部署于GSM网络.UMTS网络或LTE网 ...
 - NB-IoT DTU是什么  NB-IoT的优势有哪些
			
NB-IoT DTU是什么 NB-IoT DTU是一种采用NB-IoT技术实现数据远距离无线传输功能的终端设备,采用工业级的硬件设施和工业级的32位高性能通信处理器,工业级的无线数据传输模块,可以自动 ...
 - python使用zlib库压缩图片,使用ffmpeg压缩视频
			
python压缩图片.视频 图片压缩使用zlib库 视频压缩使用工具ffmpeg # ffmpeg -i 1.mp4 -r 10 -pix_fmt yuv420p -vcodec libx264 -p ...