spring-security 具有自定义用户ID检查的Spring Security过滤器链[重复]

pkbketx9  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(190)

此问题在此处已有答案

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

brc7rcf01#

我想通了,下面的例子是有效的。必须先调用更具体的匹配器,否则它不会起作用。

@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

        return http
                .cors()
                .and()
                .csrf()
                .disable()
                .authorizeHttpRequests()
                .antMatchers("/api/v1/users/{userId}/**")
                .access((authentication, object) -> new AuthorizationDecision(
                        object.getRequest().getServletPath().contains(
                                authentication.get().getName())
                )) 
                .antMatchers(WHITELIST_URLS)
                .permitAll()
                .antMatchers("/api/v1/**")
                .authenticated()
                .and()
                .oauth2Login(oauth2login ->
                        oauth2login.loginPage("/oauth2/authorization/api-client-oidc"))
                .oauth2Client(Customizer.withDefaults())
                .build();
    }

相关问题