如何在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()

【问题讨论】:

rightaccess 是什么意思,你的意思是正确的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 插件

前后端分离 Spring Security 对登出.logout()的处理

前后端分离 Spring Security 对登出.logout()的处理