使用者通路網站時,隻能請求其有權限的網址,而不能手動去請求其權限以外的網址。
基本配置
以下配置了3個url請求時各需要的角色或權限,注意,這并不代表現實業務中的角色和權限,你可以根據需要自己決定。
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests() //進行權限配置
.antMatchers("/anonymous1").hasAnyRole("ANONYMOUS")//角色ANONYMOUS
.antMatchers("/anonymous2").hasAnyAuthority("ROLE_ANONYMOUS")//權限ROLE_ANONYMOUS
.antMatchers("/anonymous3").anonymous()//匿名使用者
.anyRequest().authenticated()//以上未配置的其他url,需要登入才能通路
.and()
.formLogin().and() //開啟formLogin便于測試
.csrf().disable();
匿名使用者
spring security中有匿名使用者的概念,即你沒有登入,仍然會給你配置設定匿名權限:ROLE_ANONYMOUS。而帶ROLE_字首的權限 ROLE_xxx 等同于角色 xxx ,是以上面三個/anonymous的通路權限是一模一樣的,不需要登入可匿名通路。相反,登入以後就不再擁有匿名權限,将無法再通路這三個url。但是其他url必須登入以後才能通路。
常用的權限配置方法
- hasAnyRole:使用者擁有方法參數中任意一個角色,如上代碼中就是。
- hasAnyAuthority:使用者擁有方法參數中任意一個權限。
- authenticated:登入使用者。
- anonymous:匿名使用者。
- permitAll:任何人都能請求。
- denyAll:任何人不能請求。
- rememberMe:使用記住我方式登入的使用者可以請求,以後會講。
- fullyAuthenticated:使用記住我方式登入的使用者不可請求。
- hasIpAddress:指定ip位址的使用者。
- not:求反,可用于其他方法的字首。如.not().hasAnyRole("ANONYMOUS")指沒有ANONYMOUS角色的使用者。
- access:使用SpEL表達式,如下
SpEL表達式
以上方法一次隻能配置一種,如果一個url要同時比對多種方法,可使用SpEL表達式,如下,使用者同時具備role角色和auth權限。
.antMatchers("/any").access("hasAnyRole('role') and hasAnyAuthority('auth')")
- and和or:邏輯與和邏輯或。
- hasAnyRole(xxx):擁有xxx中的一個角色。
- hasAnyAuthority(xxx):擁有xxx中的一個權限。
- isAuthenticated():登入使用者。
- isAnonymous():匿名使用者。
- permitAll:任意使用者。
- denyAll:拒絕請求。
- isRememberMe():記住我登入。
- isFullyAuthenticated():非記住我登入。
- hasIpAddress(xxx):限制ip。
- !:求反。
- 含對象的表達示,如下:隻有使用者名user可以請求。authentication對象是非常重要的核心對象,以後詳解
.antMatchers("/any").access("authentication.name=='user'")
靜态資源
spring security預設會攔截任何請求,以下方法可以排除靜态資源。
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/**.html","/**.js");
}