后端基于方法的权限控制--Spirng-Security

简介: 后端基于方法的权限控制--Spirng-Security后端基于方法的权限控制--Spirng-Security默认情况下, Spring Security 并不启用方法级的安全管控. 启用方法级的管控后, 可以针对不同的方法通过注解设置不同的访问条件;Spring Security 支持三种方法级注解, 分别是 JSR-205/Secured 注解/prePostEnabled。

后端基于方法的权限控制--Spirng-Security
后端基于方法的权限控制--Spirng-Security
默认情况下, Spring Security 并不启用方法级的安全管控. 启用方法级的管控后, 可以针对不同的方法通过注解设置不同的访问条件;Spring Security 支持三种方法级注解, 分别是 JSR-205/Secured 注解/prePostEnabled。

开启方法级别注解


//@Secured 注解
@EnableGlobalMethodSecurity(securedEnabled=true)
//JSR-205 注解
@EnableGlobalMethodSecurity(jsr250Enabled=true)
//@PreAuthorize 类型的注解(支持 Spring 表达式)
@EnableGlobalMethodSecurity(prePostEnabled=true)
开始方法级别的注释使用
Secured
只有满足角色的用户才能访问被注解的方法, 否则将会抛出 AccessDenied 异常.

@Secured("ROLE_TELLER","ROLE_ADMIN"), 该方法只允许 ROLE_TELLER 或 ROLE_ADMIN 角色的用户访问.
@Secured("IS_AUTHENTICATED_ANONYMOUSLY"), 该方法允许匿名用户访问.

JSR-205

@DenyAll注解, 拒绝所有的访问
@PermitAll 注解, 运行所有访问
@RolesAllowed({"USER","ADMIN"}), 该方法只允许有 ROLE_USER 或 ROLE_ADMIN 角色的用户访问.

PreAuthorize
JSR-205 和 Secured 注解功能较弱, 不支持 Spring EL 表达式. 推荐使用 @PreAuthorize 类型的注解.

@PreAuthorize 注解, 在方法调用之前, 基于表达式结果来限制方法的使用.
@PostAuthorize 注解, 允许方法调用, 但是如果表达式结果为 false, 将抛出一个安全性异常.
@PostFilter 注解, 允许方法调用, 但必要按照表达式来过滤方法的结果.
@PreFilter 注解, 允许方法调用, 但必须在进入方法之前过来输入值.

详解PreAuthorize表达式
returnObject 保留名
对于 @PostAuthorize 和 @PostFilter 注解, 可以在表达式中使用 returnObject 保留名, returnObject 代表着被注解方法的返回值, 我们可以使用 returnObject 保留名对注解方法的结果进行验证.
比如:
@PostAuthorize ("returnObject.owner == authentication.name")
public Book getBook();
@PostAuthorize 和 @PostFilter 本身在方法之后使用 ;本身使用场景不多

表达式中的 # 号
在表达式中, 可以使用 #argument123 的形式来代表注解方法中的参数 argument123.
比如:
@PreAuthorize ("#book.owner == authentication.name")
public void deleteBook(Book book);
还有一种 #argument123 的写法, 即使用 Spring Security @P注解来为方法参数起别名, 然后在 @PreAuthorize 等注解表达式中使用该别名. 不推荐这种写法, 代码可读性较差.

@PreAuthorize("#c.name == authentication.name")
public void doSomething(@P("c") Contact contact);
内置表达式有:
表达式 备注
hasRole([role]) 如果有当前角色, 则返回 true(会自动加上 ROLE_ 前缀)
hasAnyRole([role1, role2]) 如果有任一角色即可通过校验, 返回true,(会自动加上 ROLE_ 前缀)
hasAuthority([authority]) 如果有指定权限, 则返回 true
hasAnyAuthority([authority1, authority2]) 如果有任一指定权限, 则返回true
principal 获取当前用户的 principal 主体对象
authentication 获取当前用户的 authentication 对象,
permitAll 总是返回 true, 表示全部允许
denyAll 总是返回 false, 代表全部拒绝
isAnonymous() 如果是匿名访问, 返回true
isRememberMe() 如果是remember-me 自动认证, 则返回 true
isAuthenticated() 如果不是匿名访问, 则返回true
isFullAuthenticated() 如果不是匿名访问或remember-me认证登陆, 则返回true
hasPermission(Object target, Object permission)
hasPermission(Object target, String targetType, Object permission)
原文地址https://www.cnblogs.com/weir110/p/11312598.html

相关文章
|
7月前
|
前端开发
前端接受后端文件流并下载到本地的方法
前端接受后端文件流并下载到本地的方法
1652 0
|
4月前
|
小程序 安全
Fiddler抓取小程序后端请求导入AppScan扫描快捷方法
【8月更文挑战第26天】这是一种利用 Fiddler 捕获小程序后端请求并导入 AppScan 进行安全扫描的方法。首先安装配置 Fiddler 并设置手机代理,通过 Fiddler 捕获请求;接着导出这些请求为 .saz 文件,并在 AppScan 中导入此文件,配置扫描参数后启动扫描以检测安全漏洞。操作时需确保有合法授权并遵循相关法规。尽管不同版本软件操作细节可能有所不同,但整体流程类似。
175 1
|
5月前
|
程序员
后端“timestamp“: “2024-03-20T17:59:01.892+00:00“, “stat,解决的方法,如果你要发get请求,你要添加GetMapping,不写明请求方式,会报错
后端“timestamp“: “2024-03-20T17:59:01.892+00:00“, “stat,解决的方法,如果你要发get请求,你要添加GetMapping,不写明请求方式,会报错
|
5月前
|
前端开发 JavaScript Java
文本----简单编写文章的方法(中),后端接口的编写,自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑,想写好一个项目,先分析一下需求,再理一下实现思路,再搞几层,配好参数校验,lomb
文本----简单编写文章的方法(中),后端接口的编写,自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑,想写好一个项目,先分析一下需求,再理一下实现思路,再搞几层,配好参数校验,lomb
|
7月前
|
消息中间件 缓存 算法
构建高效的后端API:优化方法与实践
随着互联网技术的迅速发展,构建高效的后端API已成为现代软件开发中的重要挑战。本文将探讨一些优化方法与实践,以帮助开发人员提高后端API的性能和可靠性。我们将讨论如何通过缓存、异步处理、数据库优化以及代码优化等方式来提升后端API的响应速度和吞吐量,从而为用户提供更好的体验。
|
7月前
|
JavaScript
vue项目中统一管理多个后端URL的方法
vue项目中统一管理多个后端URL的方法
213 0
|
前端开发
前端学习笔记202305学习笔记第二十二天-后端分页方法1
前端学习笔记202305学习笔记第二十二天-后端分页方法1
51 0
前端学习笔记202305学习笔记第二十二天-后端分页方法1
|
前端开发
前端学习笔记202305学习笔记第二十二天-后端分页方法2
前端学习笔记202305学习笔记第二十二天-后端分页方法2
72 0
前端学习笔记202305学习笔记第二十二天-后端分页方法2
|
前端开发
前端学习笔记202305学习笔记第二十二天-后端分页方法1
前端学习笔记202305学习笔记第二十二天-后端分页方法1
59 0
前端学习笔记202305学习笔记第二十二天-后端分页方法1
|
前端开发
前端学习笔记202305学习笔记第二十二天-后端分页方法2
前端学习笔记202305学习笔记第二十二天-后端分页方法2
58 0

热门文章

最新文章