Spring boot 1.5.2.Release - DefaultRolesPrefixPostProcessor不会删除默认的“ROLE_”前缀

时间:2017-05-01 18:21:19

标签: java spring-boot spring-security

在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'来解决这个问题?

1 个答案:

答案 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

在您的情况下不需要它。但是,如果要像使用它一样使用它,则必须启用方法安全性。

所以我认为你的后期处理器根本就没有用过,如果你没有手动将它发送到你尚未发布的地方。