天天看點

spring security 5 (2)-Http請求權限

使用者通路網站時,隻能請求其有權限的網址,而不能手動去請求其權限以外的網址。

基本配置

以下配置了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");
	}
           

繼續閱讀