Spring Security3 有角色而不是effect444

问题描述 投票:0回答:1

我尝试编写关于spring security3的demo,遇到问题

hasRole()
不起作用,这是部分代码,每个请求都会转移到
exceptionHandling()

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {=
        String[] userResource = this.appendPrefix(securityProps.getUserUrls());
        final String[] adminResource = this.appendPrefix(securityProps.getAdminUrls());
        final String[] commonResource = this.appendPrefix(securityProps.getCommonUrls());
=
        http.authorizeHttpRequests(auth -> {
                    // grant resource to role
                    auth.requestMatchers(userResource).hasRole(SecurityConst.ROLE_USER)
                            .requestMatchers(adminResource).hasRole(SecurityConst.ROLE_ADMIN)
                            // whitelist
                            .requestMatchers(commonResource).permitAll()
                            // default need auth
                            .anyRequest().authenticated();
                })
                .httpBasic(Customizer.withDefaults())
                // login config
                .formLogin(form -> {
                    form.loginProcessingUrl(securityProps.getLoginUrl().trim()).permitAll()
                            .successHandler(this::loginSuccessHandle)
                            .failureHandler(this::loginFailureHandle);
                })
                .logout(LogoutConfigurer::permitAll)
                .exceptionHandling(handle -> {
                    handle.authenticationEntryPoint(this::unAuthHandle);
                })
                .addFilterBefore(requestFilter(), UsernamePasswordAuthenticationFilter.class)
                .csrf(AbstractHttpConfigurer::disable)
                .cors(Customizer.withDefaults());
        return http.build();
}

但如果我尝试用

auth.requestMatchers("/**").permitAll()
替换它,那不是问题。

它困扰了我几个小时,有人可以帮助我吗,这是我在 github 中的完整代码:GitHub Repo

spring-boot spring-security
1个回答
0
投票

对我来说,你的问题似乎是你正在使用的枚举

SecurityConst.ROLE_ADMIN

Spring 安全性需要名为

ROLE_ADMIN
ROLE_USER
的角色。

由于您指的是一个枚举

ROLE_ADMIN
,它只包含字符串
ADMIN
并且
ROLE_USER
只包含字符串
USER
,所以 Spring Security 不应该使用它。

也许可以尝试这样

 public class SecurityConst {

    public static final String ROLE_USER = "ROLE_USER";

    public static final String ROLE_ADMIN = "ROLE_ADMIN";
}
© www.soinside.com 2019 - 2024. All rights reserved.