基于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. 传统的 ...
随机推荐
- linux(centos8):配置docker的cgroup driver为systemd
一,为什么要修改docker的cgroup driver? 1,什么是cgroups? cgroups(Control Groups) 是 linux 内核提供的一种机制 它可以限制.记录任务组所使用 ...
- gin框架使用orm操作数据库(转)
简介:orm俗称关系对象模型,用来映射数据库SQL和对象的工具 ,相当于mongodb里面的mongoose库,Java里面的mybatis ibatis Golang GORM使用 https: ...
- docker-docker-compose 安装
1.安装docker-compose(官网:https://github.com/docker/compose/releases) 安装: curl -L https://github.com/doc ...
- c# 误区系列(二)
前言 继续整理误区系列,可能会对刚入门的新手有些帮助,然后希望有错误的地方可以指出. 正文 关于泛型方法的确定 class Person<T> { public void add(T a) ...
- 建议你吃透python这68个内置函数!
内置函数就是Python给你提供的, 拿来直接用的函数,比如print,input等. 截止到python版本3.6.2 ,一共提供了68个内置函数,具体如下 abs() dict() help() ...
- 常用的Css函数
1. attr() 用来选择元素的属性值,用法:attr(html元素的属性名),正常搭配css content一起使用 html: <p><a href="http:// ...
- MongoDB用户,角色管理 --- MongoDB基础用法(三)
用户管理 用户创建 MongoDB采用基于角色的访问控制(RBAC)来确定用户的访问. 授予用户一个或多个角色,确定用户对MongoDB资源的访问权限和用户可以执行哪些操作. 用户应该只有最小权限集才 ...
- 宝塔面板无法进入phpadmin管理数据库解决办法
ECS--华为云 宝塔面板6.0 phpMyAdmin 4.4 经过搜索发现问题在于端口和安全组规则 解决方法如下 1.在安全中添加888端口 2.华为云安全组规则--入方向规则--添加规则 3.打开 ...
- NB-IoT的eDRX模式主要目的是什么
传统的2.56秒寻呼间隔对UE的电量消耗较大,NB-IoT的eDRX模式主要目的就是支能够持更长周期的寻呼监听,从而达到省电的目的.而在下行数据发送频率小时,通过核心网和用户终端的协商配合,用户终端调 ...
- nextInt()和nextLine()连用报错
当nextInt(),next(),nextDouble(),nextFloat()方法与nextLine()连用并放在nextLine()前面时,会出现下面的错误: Exception in thr ...