El AccessDecisionManager personalizado no se invoca cuando se agrega el filtro o de otra manera. Idealmente, me gustaría configurar filterBefore y AccessDecisionManager personalizado (usando la versión SpringBoot 1.5.2). Alternativamente, me gustaría llamar a setRolePrefix en el RoleVoter predeterminado. También se agregó DefaultRolesPrefixPostProcessor como se menciona en la Sección 8.3 de la guía de migración Spring 3 a 4, pero aún así RoleVoter busca el prefijo "ROLE_".
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired AuthenticationFilter authenticationFilter; @Bean public AccessDecisionManager accessDecisionManager() { List<AccessDecisionVoter<? extends Object>> decisionVoters = Arrays.asList( new WebExpressionVoter(), new RoleVoter(), new AuthenticatedVoter()); return new AffirmativeBased(decisionVoters); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests().accessDecisionManager(accessDecisionManager()) .anyRequest().authenticated(); http.addFilterBefore(authenticationFilter, BasicAuthenticationFilter.class); } }Parece que espera que su AccessDecisionManager sea llamado para otorgar/denegar el acceso a sus métodos seguros.
Prueba lo siguiente:
Quite la anotación @EnableGlobalMethodSecurity de su SecurityConfig .
Mueva la anotación a otra clase de configuración que amplíe GlobalMethodSecurityConfiguration .
Por ejemplo:
@Configuration @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration { @Autowired AccessDecisionManager accessDecisionManager; @Override protected AccessDecisionManager accessDecisionManager() { return this.accessDecisionManager; } }Explicación:
GlobalMethodSecurityConfiguration se encarga de crear los interceptores de métodos y no busca un bean AccessDecisionManager para usar. Debe proporcionarse uno a través de un método anulado.
NOTA: De forma predeterminada, se utilizan dos AccessDecisionManagers : uno para filtros (creado por AbstractInterceptUrlConfigurer ) y otro para métodos seguros (creado por GlobalMethodSecurityConfiguration ).
Alternativamente, me gustaría llamar a setRolePrefix en el RoleVoter predeterminado
Puede hacer esto sin tener que tocar los AccessDecisionManager predeterminados:
@Bean public GrantedAuthorityDefaults grantedAuthorityDefaults() { return new GrantedAuthorityDefaults(""); } Esto establecerá el prefijo de rol en "" en ambos AccessDecisionManagers predeterminados.