一、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安全表达式控制系统功能访问权限问题相关推荐

  1. Linux安装svn服务器和权限配置_亲测成功

    Linux安装svn服务器和权限配置_亲测成功 SVN简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目 ...

  2. 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 ...

  3. Google启用年龄查证系统 控制成人内容访问权限

    Google启用年龄查证系统 控制成人内容访问权限[@more@]Google(韩国)公司日前宣布,其计划在今年晚些时候引入"年龄查证"系统,严格控制那些对19岁及以上人的开放的成 ...

  4. jooq权限配置_将jOOQ与Spring结合使用:配置

    jooq权限配置 我遇到了由ORM引起的性能问题. 尽管我不得不承认大多数这些问题确实是由您造成的,但是我开始认为在只读操作中使用ORM是不值得的. 我开始寻找实现这些操作的替代方法. 这就是我遇到j ...

  5. java 接口权限控制_手把手教你搞定权限管理,结合Spring Security实现接口的动态权限控制!...

    SpringBoot实战电商项目mall(30k+star)地址:github.com/macrozheng/- 摘要 权限控管理作为后台管理系统中必要的功能,mall项目中结合Spring Secu ...

  6. service获取selinux权限_Spring Boot 整合 Spring Security 示例实现前后分离权限注解 + JWT 登录认证...

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 99套Java企业级实战项目 4000G架构师资料 作者:Sans_ juejin.im/post/5da82f066 ...

  7. 配置共享文件夹--不同文件夹设置不同访问权限

    1 目的 用户可以远程访问服务器上的共享文件夹,每个用户只能访问所在分组的文件夹.管理员拥有全部文件夹的完全控制权限. 2 设置服务器的文件共享属性 点击右下角的"网络和共享中心" ...

  8. Java的访问控制修饰符有哪些?各有什么访问权限?

    访问修饰控制符: 有3种访问修饰符:public.private.protected. 以及不使用关键字的默认访问权限 访问权限: 权限修饰符 同一个类 同一个包 不同包的子类 不同包的非子类 pri ...

  9. 网络上的计算机无权限访问权限,电脑连不上网,提示无网络访问权限怎么办?...

    原标题:电脑连不上网,提示无网络访问权限怎么办? 网络提示无网络访问权限该如何解决?这是前几天一位网友问云骑士的问题,下面就与大家一起分享. 电脑连不上网,提示无网络访问权限的解决办法: 方法一:诊断 ...

最新文章

  1. C语言-求字符串长度-strlen()与sizeof()
  2. 创建商品类java_SSH框架网上商城项目第9战之添加和更新商品类别功能实现
  3. Android Kotlin 协程async
  4. Python处理word文件
  5. MSP430F5529 DriverLib 库函数学习笔记(十五)SFR 模块
  6. 【Apache】Apache ab压力测试工具Window下载和用法详解
  7. 表单的ajax填入问题
  8. Element-UI-简单介绍---Element-UI工作笔记001
  9. 【转】探讨android更新UI的几种方法----不错
  10. mount -o nolock
  11. 当vue遇到pwa--vue+pwa移动端适配解决方案模板案例
  12. nginx实时生成缩略图到硬盘上
  13. cxf 服务器响应超时时间,CXF日志响应时间
  14. UI漂亮音乐分享网站源码
  15. 微信小程序详细图文教程10分钟解决
  16. 基于 DolphinDB 的行情中心解决方案
  17. 解决Xcode Simulator 黑屏问题
  18. 5 torch.utils.data (Dataset,TensorDataset,DataLoader)
  19. 打印正三角、倒三角 和 n行n列星星
  20. 安鑫 阿里、腾讯、百度,谁将成为互联网的老大

热门文章

  1. 麻省理工学院(MIT)的公开课程
  2. [转]关于多线程并发:每个开发人员都应了解的内容(转自Mainz's)
  3. vue 出现Elements in iteration expect to have 'v-bind:key' directives
  4. 【JUC】CountDownLatch
  5. scrapy 让指定的spider执行指定的pipeline
  6. Cracking the Coding Interview 5.2
  7. 系统带你学习 WebAPIs 第一讲
  8. 微信小程序——解决上传并部署云函数时报错ResourceNotFound.Function, 未找到函数版本,请创建后再试。 (7f2d9d2d-5eac-4575-9n57-acd66cfa587g
  9. [pytorch、学习] - 4.2 模型参数的访问、初始化和共享
  10. PHP 实现随机字符串,可作为随机密码