我尝试编写关于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
对我来说,你的问题似乎是你正在使用的枚举
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";
}