java安全权限配置_使用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")
@Slf4j
public 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安全表达式控制系统功能访问权限问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
java安全权限配置_使用Spring安全表达式控制系统功能访问权限问题相关推荐
- Linux安装svn服务器和权限配置_亲测成功
Linux安装svn服务器和权限配置_亲测成功 SVN简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目 ...
- Java继承中为什么不可以降低父类重写方法的访问权限
1 2 3 4 5 6 7 8 9 10 class A { protected int method1(int a, int b) { return 0; } } public class B ex ...
- Google启用年龄查证系统 控制成人内容访问权限
Google启用年龄查证系统 控制成人内容访问权限[@more@]Google(韩国)公司日前宣布,其计划在今年晚些时候引入"年龄查证"系统,严格控制那些对19岁及以上人的开放的成 ...
- jooq权限配置_将jOOQ与Spring结合使用:配置
jooq权限配置 我遇到了由ORM引起的性能问题. 尽管我不得不承认大多数这些问题确实是由您造成的,但是我开始认为在只读操作中使用ORM是不值得的. 我开始寻找实现这些操作的替代方法. 这就是我遇到j ...
- java 接口权限控制_手把手教你搞定权限管理,结合Spring Security实现接口的动态权限控制!...
SpringBoot实战电商项目mall(30k+star)地址:github.com/macrozheng/- 摘要 权限控管理作为后台管理系统中必要的功能,mall项目中结合Spring Secu ...
- service获取selinux权限_Spring Boot 整合 Spring Security 示例实现前后分离权限注解 + JWT 登录认证...
点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 99套Java企业级实战项目 4000G架构师资料 作者:Sans_ juejin.im/post/5da82f066 ...
- 配置共享文件夹--不同文件夹设置不同访问权限
1 目的 用户可以远程访问服务器上的共享文件夹,每个用户只能访问所在分组的文件夹.管理员拥有全部文件夹的完全控制权限. 2 设置服务器的文件共享属性 点击右下角的"网络和共享中心" ...
- Java的访问控制修饰符有哪些?各有什么访问权限?
访问修饰控制符: 有3种访问修饰符:public.private.protected. 以及不使用关键字的默认访问权限 访问权限: 权限修饰符 同一个类 同一个包 不同包的子类 不同包的非子类 pri ...
- 网络上的计算机无权限访问权限,电脑连不上网,提示无网络访问权限怎么办?...
原标题:电脑连不上网,提示无网络访问权限怎么办? 网络提示无网络访问权限该如何解决?这是前几天一位网友问云骑士的问题,下面就与大家一起分享. 电脑连不上网,提示无网络访问权限的解决办法: 方法一:诊断 ...
最新文章
- C语言-求字符串长度-strlen()与sizeof()
- 创建商品类java_SSH框架网上商城项目第9战之添加和更新商品类别功能实现
- Android Kotlin 协程async
- Python处理word文件
- MSP430F5529 DriverLib 库函数学习笔记(十五)SFR 模块
- 【Apache】Apache ab压力测试工具Window下载和用法详解
- 表单的ajax填入问题
- Element-UI-简单介绍---Element-UI工作笔记001
- 【转】探讨android更新UI的几种方法----不错
- mount -o nolock
- 当vue遇到pwa--vue+pwa移动端适配解决方案模板案例
- nginx实时生成缩略图到硬盘上
- cxf 服务器响应超时时间,CXF日志响应时间
- UI漂亮音乐分享网站源码
- 微信小程序详细图文教程10分钟解决
- 基于 DolphinDB 的行情中心解决方案
- 解决Xcode Simulator 黑屏问题
- 5 torch.utils.data (Dataset,TensorDataset,DataLoader)
- 打印正三角、倒三角 和 n行n列星星
- 安鑫 阿里、腾讯、百度,谁将成为互联网的老大
热门文章
- 麻省理工学院(MIT)的公开课程
- [转]关于多线程并发:每个开发人员都应了解的内容(转自Mainz's)
- vue 出现Elements in iteration expect to have 'v-bind:key' directives
- 【JUC】CountDownLatch
- scrapy 让指定的spider执行指定的pipeline
- Cracking the Coding Interview 5.2
- 系统带你学习 WebAPIs 第一讲
- 微信小程序——解决上传并部署云函数时报错ResourceNotFound.Function, 未找到函数版本,请创建后再试。 (7f2d9d2d-5eac-4575-9n57-acd66cfa587g
- [pytorch、学习] - 4.2 模型参数的访问、初始化和共享
- PHP 实现随机字符串,可作为随机密码