此问题在此处已有答案:
How to fix role in Spring Security?(2个答案)
两个月前关门了。
我尝试对用户ID路径变量使用基于表达式的检查,因此用户只能访问属于自己的资源。Spring documentation中对此有非常清楚的描述。但是我无法访问bean,错误是提供了String
。
这是我的安全过滤器链和bean:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.cors()
.and()
.csrf().disable()
.authorizeHttpRequests()
.antMatchers(WHITELIST_URLS).permitAll()
.antMatchers("/api/**").authenticated()
.antMatchers("/api/**/users/{userId}/**").access("@userSecurity.checkUserId(authentication,#userId)")
.and()
.oauth2Login(oauth2login ->
oauth2login.loginPage("/oauth2/authorization/api-client-oidc"))
.oauth2Client(Customizer.withDefaults())
.build();
}
public static class UserSecurityConfig extends WebSecurityConfiguration {
@Bean("userSecurity")
private boolean checkUserId(Authentication authentication, String userId) {
return authentication.getPrincipal().equals(userId);
}
}
错误:
Required type: AuthorizationManager
<org.springframework.security.web.access.intercept.RequestAuthorizationContext>
Provided: String
我还尝试使用AuthorizationDecision
(作为lambda表达式),但无法访问路径变量。
Spring文档在这一点上是不是错的?一直在搜索安静一段时间,但大多发现了与Spring文档中相同的东西。
实际上,我希望通过使用@PreAuthorize
注解,在配置中全局管理此操作,而不是在控制器中的每个Map上进行管理。
编辑:
我一直在尝试使用以下方法解决此问题,但没有成功:
.access((authentication, object) ->
new AuthorizationDecision(object.getRequest().getServletPath().contains(
authentication.get().getName())))
或
.access((authentication, object) ->
new AuthorizationDecision(authentication.get().getPrincipal().equals(
object.getVariables().get("#userId"))))
1条答案
按热度按时间brc7rcf01#
我想通了,下面的例子是有效的。必须先调用更具体的匹配器,否则它不会起作用。