2015-06-13 29 views
20

我對內容管理系統的工作,那有五個antMatchers類似如下:多antMatchers

http.authorizeRequests() 
     .antMatchers("/", "/*.html").permitAll() 
     .antMatchers("/user/**").hasRole("USER") 
     .antMatchers("/admin/**").hasRole("ADMIN") 
     .antMatchers("/admin/login").permitAll() 
     .antMatchers("/user/login").permitAll() 
     .anyRequest().authenticated() 
     .and() 
     .csrf().disable(); 

其假設爲是指遊客可以看到在根路徑上的所有網站(/ *) ,並且用戶只能看到(/ user),管理員只能看到(/ admin),並且有兩個登錄頁面供用戶使用,另一個用於管理員。

該代碼似乎工作正常,除了管理部分 - 它不起作用,但返回訪問被拒絕異常。

回答

39

我認爲,問題出在爲了你的規則

.antMatchers("/admin/**").hasRole("ADMIN") 
.antMatchers("/admin/login").permitAll() 

規則的事項和更具體的規則的順序應該先走。現在,以/admin開頭的所有內容都需要具有ADMIN角色的認證用戶,即使是/admin/login路徑(因爲/admin/login已與/admin/**規則相匹配,因此第二個規則將被忽略)。

因此登錄頁面的規則應該在/admin/**規則之前。例如。

.antMatchers("/admin/login").permitAll() 
.antMatchers("/admin/**").hasRole("ADMIN")