如何在spring security中逻辑组合pathMatchers
Posted
技术标签:
【中文标题】如何在spring security中逻辑组合pathMatchers【英文标题】:How to logically combine pathMatchers in spring security 【发布时间】:2021-06-20 11:57:10 【问题描述】:我正在尝试为 kotlin 中的 WebFlux 项目设置 Spring Security。假设我有以下端点:
/departments/deptId/users
如果以下两项检查都为真,我需要允许访问它:
如果用户有权访问给定的 deptId 如果用户具有 UserManagement 权限。我可以让它们分开工作,但我找不到将它们(逻辑与)组合在一起的方法: 如果
,我想返回 403 用户有权限,但没有访问权限 用户有访问权限,但没有权限 如果有访问权限,则返回 200下面的代码忽略了第一次检查——它只检查用户是否有用户管理权限:
@Bean
fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain =
http
.oauth2ResourceServer()
.jwt().jwtAuthenticationConverter(jwtConverter).and()
.and()
.authorizeExchange()
.pathMatchers("/departments/deptId/**").access(hasAccessToDept)
.and()
.authorizeExchange()
.pathMatchers(
"/departments/deptId/users*",
"/departments/deptId/users/*")
.hasAuthority(USER_MANAGEMENT)
.anyExchange().authenticated()
.and()
.build()
【问题讨论】:
right
和access
是什么意思,你的意思是正确的role
和正确的authority
?
access
我的意思是ReactiveAuthorizationManager
的自定义实现,我在.access
方法中使用它。我的意思是权威。
【参考方案1】:
您可以查看“基于表达式的安全性”。有了这个,您可以将表达式放在相应的 Controller 方法上。您也可以访问参数和返回值,我特别喜欢这些定义接近它们将应用到的代码。
@PreAutorize(„hasRole(...)“)
或
@PostAuthorize(...)
这是文档的链接: https://docs.spring.io/spring-security/site/docs/4.2.x/reference/html/el-access.html
编辑:
您也可以在过滤器配置中使用表达式,如下所示:
authorizeRequests().antMatchers("/user/**").access("@webSecurity.check(authentication,request)")
【讨论】:
它是 kotlin 中的 webflux 应用程序,没有控制器 - 我有处理程序,它接收 ServerRequest。不确定在这种情况下是否可以应用注释 我刚刚意识到你正在使用它。hassaccessDept
的内容是什么。在该 bean 中,您也可以注入 SecurityContext 并获取用户角色。
谢谢!我尝试了它并且它有效,但是它不像我计划的那样优雅:) 我希望我可以将 pathMatchers 组合成一种逻辑 AND 表达式链。因此,对于/depts/deptId/users
的请求,它会检查第一个 pathMatcher (/depts/deptId,如果它是真的,请检查下一个 /depts/deptId/users
。如果其中一个是假的 - 返回 403。无论如何,谢谢你的建议!我'将等待几天,然后将发布我最终得到的内容。
啊,我明白了。没有。据我所知,这只是第一场比赛。只是教育:也许你可以颠倒 PathMatcher 的定义,所以最具体的是第一个。然后您在访问评估中自己调用具有较短路径的过滤器链?不确定性能如何:)以上是关于如何在spring security中逻辑组合pathMatchers的主要内容,如果未能解决你的问题,请参考以下文章
手把手教你如何使用Spring Security(中):接口认证
Spring Security:2.4.3 Project Modules
配置 Spring Security 以在认证后返回 JSON 响应
使用用户名作为电子邮件,Spring Security UI 插件