Spring Security 控制授权的方法
作者:盲枸 发布时间:2023-08-06 19:21:08
本文介绍了Spring Security 控制授权的方法,分享给大家,具体如下:
使用授权方法进行授权配置
每一个 Spring Security 控制授权表达式(以下简称为表达式)实际上都在在 API 中对应一个授权方法,该方法是请求的 URL 权限配置时的处理方法。例如:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers(HttpMethod.DELETE, "/user/*").hasRole("ADMIN")
.antMatchers("/index").permitAll()
.antMatchers("/pay").hasAnyRole("WE_CHAT_PAY", "ALI_PAY")
.antMatchers("/debug").hasIpAddress("192.168.1.0/24");
}
使用授权表达式给多权限要求的请求授权
那么,何时需要用到表达式进行授权处理呢?一个安全应用的权限要求往往是复杂多样的,比如,项目的调试请求希望访问者既要拥有管理员权限又必须是通过公司内部局域网内部访问。而这样的需求下,仅仅通过Security API 提供的方法是无法满足的,因为这些授权方法是无法连续调用的。
此时就可以使用授权表达式解决:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/debug")
.access("hasRole('ADMIN') and hasIpAddress('192.168.1.0/24')");
}
授权表达式举例说明
表达式 | 说明 |
---|---|
permitAll | 永远返回 true |
denyAll | 永远返回 false |
anonyous | 当前用户若是匿名用户返回 true |
rememberMe | 当前用户若是 rememberMe 用户返回 true |
authenticated | 当前用户若不是匿名(已认证)用户返回 true |
fullAuthenticated | 当前用户若既不是匿名用户又不是 rememberMe 用户时返回 true |
hasRole(role) | 当前用户权限集合中若拥有指定的 role 角色权限(匹配时会在你所指定的权限前加'ROLE_',即判断是否有“ROLE_role”权限)时返回 true |
hasAnyRole(role1, role2, ...) | 当前用户权限集合中若拥有任意一个角色权限时返回 true |
hasAuthority(authority) | 当前用户权限集合中若具有 authority 权限(匹配是否有“authority”权限)时返回 true |
hasAnyAuthority(authority) | 当前用户权限集合中若拥有任意一个权限时返回 true |
hasIpAddress("192.168.1.0/24") | 发送请求的IP匹配时fanhui true |
基于角色的访问控制 RBAC(Role-Based Access Control)
或许你会认为上述方式已能满足绝大多数应用安全授权管理。但事实上的企业级应用的授权往往是基于数据库数据动态变化的,若是使用上述方式进行字符串拼接,不仅对于开发者极不友好(每一次人人员变动都意味着需要改代码,显然不合理),而且应用的性能也会随之降低。那么,如何解决呢?
数据模型
通用的 RBAC 数据模型, 一般需要五张表(三张实体表,两张关系表)。三张实体表包括用户表、角色表、资源表。两张关系表包括。其之间关系如下图:
RBAC数据模型
用户表
任何一个用户都必须要有用户表,当公司发生人员变动时,由业务人员(如人力资源)对该数据表进行增删记录。
角色表
公司有哪些身份的人,例如总裁、副总裁、部门经理等,有业务人员根据公司的具体情况对该表数据进行操作。
资源表
存储需要进行权限控制的资源,由于我们进行控制授权时实际上是基于 URL 的,但业务人员非按 URL 组织数据条目,而是以视图界面的形式进行曹操作。所以在这张表中存储的是呈现给业务人员的菜单、按钮及其所进行权限控制的 URL 。
用户—角色关系表
用户表与角色表(用户 id 与角色id )之间是一个多对多的关系。一个用户可以是多个角色(一个用户既可以是部门经理又可以是某个管理员),而一个角色往往对应多个用户。
角色—资源关系表
角色表与资源表()也是一个多对多的关系。一种角色可以访问多个资源(按钮或菜单等),一个资源也可以被多个角色访问。
spring security 还支持自定义表达式来完成这项工作,就像这样
来源:https://www.jianshu.com/p/01498e0e0c83


猜你喜欢
- optString方法会在对应的key中的值不存在的时候返回一个空字符串,但是getString会抛一个JSONException 。 /*
- 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很
- 前言本文主要介绍了关于JDK源码分析之String、StringBuilder和StringBuffer的相关内容,分享出来供大家参考学习,
- MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及
- JAVA中反射机制(JavaBean的内省与BeanUtils库)内省(Introspector) 是Java 语言对JavaBean类属性
- 一、读取系统配置文件application.yaml1、application.yaml配置文件中增加一下测试配置testdata: &nb
- 1. 前言本文主要是介绍一下RocketMQ消息生产者在发送消息的时候发送失败的问题处理?这里有两个点,一个是关于消息的处理,一个是关于br
- 下面提供三种计时器的写法供大家参考,大家可以自行选择自己钟爱的使用。写法一(Spring 包提供的计时器):import java.text
- 游戏服务器里面总是有一大堆的配置文件需要读取, 而且这些配置文件的读取: * 要不然做成弱类型的, 就是一堆字符串或者数字, 不能看出来错误
- java读取文件里面部分汉字内容乱码读取一个txt文件,到代码中打印出来,发票有部分汉字的内容是乱码的。我开始的方式是这样的, 如下,这是完
- Qt的版本发布越来越频繁,Qt6发布已经有一段时间了,越来越多的人咨询之前的代码是否可以增加对Qt6的支持,包括开源的项目QWidgetDe
- 这几天做项目,有些地方的图片需要用到圆形图片,所以百度了一下,在github上找到一个开源项目,处理很简单,效果如下: 使用起来特
- 在实际的应用中会经常需要将数据导出成excel,导出的方式除原样导出还有分页导出、分页分sheet导出和大数据量导出。对于excel2003
- Spring Security 基本介绍这里就不对Spring Security进行过多的介绍了,具体的可以参考官方文档我就只说下Sprin
- 测试springboot项目出现Test Ignored今天在写springBoot项目运行测试类时出现了以下问题:Test ignored
- 思路要求ScrollView 嵌套 地址栏 和 WebView手指滑屏向下滚动(网页向上),如果网页有滚动条,首先把 地址栏 滚动到消失,然
- 判断参数是否为空并作为查询条件@Override public Page<DemandEntity>
- 关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种:第一种:通过注解@PostConstruct 和 @
- 本文是针对AndBase框架学习整理的第二篇笔记,想要了解AndBase框架的朋友可以阅读本文,大家共同学习。使用AbActivity内部封
- maven简介及优势 maven是一个项目构建和管理的工具,提供了帮助管理 构建、文档、报告