如何在Spring Security 中逻辑地组合pathmatchers

35g0bw71  于 2021-07-15  发布在  Java
关注(0)|答案(1)|浏览(875)

我正在尝试为kotlin的webflux项目设置Spring Security 。假设我有以下端点: /departments/{deptId}/users 如果下面两个检查都是真的,我需要允许访问它:
如果用户有权访问给定的deptid
如果用户具有用户管理权限。
我可以使它们分开工作,但我找不到一种方法将它们组合在一起(逻辑and):如果
用户有权限,但没有访问权限
用户有访问权限,但没有权限,如果有访问权限,则返回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()
p5fdfcr1

p5fdfcr11#

你可以看看“基于表达式的安全性”。有了它,您可以将表达式放在相应的控制器方法上。您也可以访问参数和返回值,而且我特别喜欢这些定义接近于它们将应用到的代码。

@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)")

相关问题