在Spring Boot应用程序中定义了DefaultRolesPrefixPostProcessor,如参考手册第8.3节所述。摘录如下:
public class DefaultRolesPrefixPostProcessor implements BeanPostProcessor, PriorityOrdered {
@Override
public Object postProcessAfterInitialization(final Object bean, final String beanName) {
if (bean instanceof DefaultMethodSecurityExpressionHandler) {
((DefaultMethodSecurityExpressionHandler) bean).setDefaultRolePrefix(null);
}
.... // if statement for DefaultWebSecurityExpressionHandler
.... // if statement for SecurityContextHolderAwareRequestFilter
return bean;
}
SecurityConfig类重写configure(HttpSecurity)方法:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
....
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated();
http.addFilterBefore(authenticationFilter, BasicAuthenticationFilter.class);
}
}
然而,任何@Secured方法仍然需要“ROLE_”前缀,否则会收到403,主要是由于默认的AccessDecisionManager的RoleVoter返回0
@RestController
public class MyController {
@Secured("ROLE_XXX")
public String hello() {
return "hello";
}
}
无论如何要解决这个问题,还是使用'hasAuthority'来解决这个问题?
答案 0 :(得分:0)
您应该从班级@EnableWebSecurity
SecurityConfig
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// your config
}
}
如果您使用@EnableWebSecurity
,则默认配置完全关闭
关闭默认Web应用程序安全配置 完全可以添加带
的bean
在您的情况下不需要它。但是,如果要像使用它一样使用它,则必须启用方法安全性。
所以我认为你的后期处理器根本就没有用过,如果你没有手动将它发送到你尚未发布的地方。