1

我想配置春季啓動 - 嵌入式Tomcat基本HTTP身份驗證與多個角色,其中大部分網址的類似,但很少具體到每個角色。這裏的第一個角色是基本的HTTP身份驗證彈出並正常工作。下面的代碼,春季啓動基本HTTP身份驗證與多個角色拋出403禁止錯誤

@Configuration 
    @EnableWebMvcSecurity 
    @EnableGlobalMethodSecurity(prePostEnabled = true) 

public class TestSecurityAdapter extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.csrf().disable() 
       .authorizeRequests().antMatchers(null, getAppAdminRolePaths()).authenticated() 
       .anyRequest().hasAnyRole("APPADMIN") 
       .and() 
       .httpBasic(); 

     http.csrf().disable() 
       .authorizeRequests().antMatchers(null, getAppUserRolePaths()).authenticated() 
       .anyRequest().hasAnyRole("APPUSER") 
       .and() 
       .httpBasic(); 

     http.authorizeRequests().antMatchers(null, new String[]{"/app/appOwnerView.html"}).authenticated() 
       .anyRequest().hasAnyRole("APPOWNER") 
       .and() 
       .httpBasic(); 
    } 

    @Override 
    @Autowired 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.inMemoryAuthentication().withUser("appadminname").password("appadminpwd").roles("APPADMIN").and() 
     .withUser("appusername").password("appuserpwd").roles("APPUSER").and() 
     .withUser("appownername").password("appoownerpwd").roles("APPOWNER"); 
    } 

    private static String[] getAppAdminRolePaths(){ 
     return new String[]{"/appweb/*", 
       "/app/checkService.html",    
       "/app/index.html",     
       "/app/testData.html",  
       "/app/adminView.html", 
       "/app/demo.html"}; 
    } 

    private static String[] getAppUserRolePaths(){ 
     return new String[]{"/appweb/*", 
       "/app/checkService.html",    
       "/app/index.html",     
       "/app/testData.html",  
       "/app/userView.html", 
       "/app/demo.html"}; 
    } 
} 

對於與URL http://localhost:8080/app/index.html瀏覽器的HTTP用戶名/密碼彈出與appadminname說/ appadminpwd它工作正常。但是對於相同的網址,如果我輸入appusername/appuserpwd它會拋出HTTP 403禁止訪問錯誤。這裏爲什麼配置APPUSER的第二個角色是拋出這個錯誤是我不確定。請讓我們知道是否有辦法解決這個問題。

感謝

回答

0

我明白這個問題是有點老了,但是這可能仍然是有用的人。首先,我不確定爲什麼你的antMatchers()調用提供null作爲第一個參數;我不知道爲什麼你的調用antMatchers()提供了null作爲第一個參數;我不知道爲什麼你的調用antMatchers antMatchers()需要一個字符串列表來定義這個規則所涵蓋的URL,所以我不確定在這種情況下null應該匹配什麼。

其次,anyRequest()表示該規則將被應用到對應用進行無論所使用的URL的任何請求,並且Spring將在它們被定義的順序應用安全規則。您通常會首先定義URL及其相關角色,然後默認爲任何其他請求的規則(必須通過身份驗證(但不一定需要任何特定角色)),然後使用類似anyRequest()的方式進行身份驗證(012)。第一條規則說任何對應用程序的請求必須由具有角色APPADMIN的用戶進行,該角色在您嘗試以appusername身份登錄時拒絕您訪問,所以第二條允許APPUSER的規則甚至不會被處理。

第三,你要http.authorizeRequests()進行多個通話時,你應該很可能實際上是鏈接在一起的它們,例如:

http.csrf().disable().authorizeRequests() 
    .antMatchers(getAppAdminRolePaths()).hasRole("APPADMIN") 
    .antMatchers(getAppUserRolePaths()).hasRole("APPUSER") 
    .anyRequest().authenticated(); 


最後,當你有隻需檢查一個角色,就可以使用hasRole()而不是hasAnyRole()。

您也不需要在同一規則中提供authenticated()和hasRole(),因爲hasRole()意味着用戶已經過身份驗證。

您可以在Spring文檔中找到更多解釋和示例:http://docs.spring.io/spring-security/site/docs/4.0.3.RELEASE/reference/htmlsingle/#authorize-requests