千家信息网

如何使用Spring安全表达式控制系统功能访问权限问题

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章给大家分享的是有关如何使用Spring安全表达式控制系统功能访问权限问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、SPEL表达式权限控制从spring se
千家信息网最后更新 2025年01月20日如何使用Spring安全表达式控制系统功能访问权限问题

这篇文章给大家分享的是有关如何使用Spring安全表达式控制系统功能访问权限问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一、SPEL表达式权限控制

从spring security 3.0开始已经可以使用spring Expression表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。Spring Security可用表达式对象的基类是SecurityExpressionRoot。

表达式函数描述
hasRole([role])用户拥有指定的角色时返回true (Spring security默认会带有ROLE_前缀),去除前缀参考Remove the ROLE_
hasAnyRole([role1,role2])用户拥有任意一个指定的角色时返回true
hasAuthority([authority])拥有某资源的访问权限时返回true
hasAnyAuthority([auth1,auth2])拥有某些资源其中部分资源的访问权限时返回true
permitAll永远返回true
denyAll永远返回false
anonymous当前用户是anonymous时返回true
rememberMe当前用户是rememberMe用户返回true
authentication当前登录用户的authentication对象
fullAuthenticated当前用户既不是anonymous也不是rememberMe用户时返回true
hasIpAddress('192.168.1.0/24'))请求发送的IP匹配时返回true

部分朋友可能会对Authority和Role有些混淆。Authority作为资源访问权限可大可小,可以是某按钮的访问权限(如资源ID:biz1),也可以是某类用户角色的访问权限(如资源ID:ADMIN)。当Authority作为角色资源权限时,hasAuthority('ROLE_ADMIN')与hasRole('ADMIN')是一样的效果。

二、SPEL在全局配置中的使用

我们可以通过继承WebSecurityConfigurerAdapter,实现相关的配置方法,进行全局的安全配置(之前的章节已经讲过) 。下面就为大家介绍一些如何在全局配置中使用SPEL表达式。

2.1.URL安全表达式

config.antMatchers("/system/*").access("hasAuthority('ADMIN') or hasAuthority('USER')") .anyRequest().authenticated()

这里我们定义了应用/person/*URL的范围,只有拥有ADMIN或者USER权限的用户才能访问这些person资源。

2.2.安全表达式中引用bean

这种方式,比较适合有复杂权限验证逻辑的情况,当Spring Security提供的默认表达式方法无法满足我们的需求的时候。首先我们定义一个权限验证的RbacService。

@Component("rbacService")@Slf4jpublic class RbacService { //返回true表示验证通过 public boolean hasPermission(HttpServletRequest request, Authentication authentication) { //验证逻辑代码 return true; } public boolean checkUserId(Authentication authentication, int id) { //验证逻辑代码 return true; }}

对于"/person/{id}"对应的资源的访问,调用rbacService的bean的方法checkUserId进行权限验证,传递参数为authentication对象和person的id。该id为PathVariable,以#开头表示。

config.antMatchers("/person/{id}").access("@rbacService.checkUserId(authentication,#id)") .anyRequest().access("@rbacService.hasPermission(request,authentication)");

三、 Method表达式安全控制

如果我们想实现方法级别的安全配置,Spring Security提供了四种注解,分别是@PreAuthorize , @PreFilter , @PostAuthorize 和 @PostFilter

3.1.开启方法级别注解的配置

在Spring安全配置代码中,加上EnableGlobalMethodSecurity注解,开启方法级别安全配置功能。

@Configuration@EnableGlobalMethodSecurity(prePostEnabled = true)public class MySecurityConfig extends WebSecurityConfigurerAdapter {

3.2 使用PreAuthorize注解

@PreAuthorize 注解适合进入方法前的权限验证。只有拥有ADMIN角色才能访问findAll方法。

@PreAuthorize("hasRole('ADMIN')")List findAll();

3.3 使用PostAuthorize注解

@PostAuthorize 在方法执行后再进行权限验证,适合根据返回值结果进行权限验证。Spring EL 提供返回对象能够在表达式语言中获取返回的对象returnObject。下文代码只有返回值的name等于authentication对象的name才能正确返回,否则抛出异常。

@PostAuthorize("returnObject.name == authentication.name")Person findOne(Integer id);

3.4 使用PreFilter注解

PreFilter 针对参数进行过滤,下文代码表示针对ids参数进行过滤,只有id为偶数才能访问delete方法。

//当有多个对象是使用filterTarget进行标注@PreFilter(filterTarget="ids", value="filterObject%2==0")public void delete(List ids, List usernames) {

3.5 使用PostFilter 注解

PostFilter 针对返回结果进行过滤,特别适用于集合类返回值,过滤集合中不符合表达式的对象。

@PostFilter("filterObject.name == authentication.name")List findAll();

感谢各位的阅读!关于"如何使用Spring安全表达式控制系统功能访问权限问题"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

权限 表达式 方法 用户 安全 资源 验证 对象 注解 配置 控制 代码 角色 只有 逻辑 功能 全局 参数 级别 控制系统 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 淘宝买代理服务器 电力企业网络安全研讨会 计算机网络技术和软件专业 微服务可以部署在单台服务器上吗 杭州网络安全案件 access创建销售数据库 江苏app软件开发哪里好 江苏安卓软件开发定制 txt文档中有两列数据库 数据库在技术上的工作过程是 不属于3g网络技术体制 明日之后的四个字服务器怎么下载 访问dns服务器 安徽服务器阵列卡安装云服务器 惠普软件开发待遇 软件开发工程师就业背景 软件开发企业退所得税 萍乡服务器回收公司 幼儿园小班网络安全活动教案 宝塔怎么找对应数据库 二道区智能网络技术咨询有哪些 计算机软件开发者有署名权 汕头百分网络技术有限公司 江苏蓝河网络技术有限公司 OpenSky数据库 爬虫放到服务器上安全吗 java运行时改变数据库 计算机网络技术需要什么成绩 奇迹mu单机怪物数据库 天津升本计算机网络技术
0