2017-05-01 65 views
0

在Spring Boot應用程序中已經定義了DefaultRolesPrefixPostProcessor,如參考手冊的8.3節所述。下面示出摘錄:Spring引導1.5.2.Release - DefaultRolesPrefixPostProcessor不會刪除默認的「ROLE_」前綴

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類替代配置(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

您應該從類中刪除@EnableWebSecuritySecurityConfig

@Configuration 
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     // your config 
    } 
} 

如果使用@EnableWebSecurity,默認的配置是完全關閉

要關閉默認的Web應用程序安全配置 完全可以加入豆與

你的情況不需要。但是,如果您想像您一樣使用方法安全性,則必須啓用方法安全性。

所以我認爲你的後置處理器根本沒有使用,如果你沒有這個手動的地方你沒有發佈。