1. 程式人生 > >SpringBootSecurity學習(06)網頁版登入方法級別的許可權

SpringBootSecurity學習(06)網頁版登入方法級別的許可權

使用者授權

前面討論過,Web應用的安全管理,主要包括兩個方面的內容,一個是使用者身份的認證,即使用者登入的設計,二是使用者授權,即一個使用者在一個應用系統中能夠執行哪些操作的許可權管理。前面介紹了登入,下面簡單介紹一下使用者授權。使用者擁有的許可權是根據使用者的角色來決定的,並且security中,使用者的許可權可以控制到方法級別。

方法級別的許可權控制

每個url的訪問都是定義在controller方法上面的,因此需要配置方法許可權。開啟方法級別的許可權,需要引入@EnableGlobalMethodSecurity註解:

註解中有三個引數,securedEnabled = true 表示方法許可權控制可以使用安全註解 @Secured, 該註解的值 必須在現有的角色名稱前加上ROLE_字首,如 @Secured("ROLE_ADMIN"),多個角色可以這樣寫 @Secured({"ROLE_ONE","ROLE_TWO"}),表示最少有其中一個角色才能訪問。

prePostEnabled = true 表示方法許可權前置註解 @PreAuthorize,@PostAuthorize啟用,註解 @PreAuthorize 適合進入方法之前驗證授權。 @PreAuthorize可以兼顧,角色/登入使用者許可權,引數傳遞給方法等等 ,@PreAuthorize("true") 表示允許所有訪問,註解 @PostAuthorize 不經常使用,它在檢查授權方法之後才被執行,所以它適合用在對返回的值作驗證授權。Spring EL提供可在表示式語言來訪問並從方法返回 returnObject 物件來反映實際的物件。@PreAuthorize單個角色可以這樣寫 @PreAuthorize("hasRole('TWO')"),多個角色可以這樣寫 @PreAuthorize("hasRole('ONE') AND hasRole('TWO')"),@PreAuthorize("hasRole('ONE') OR hasRole('TWO')")注意and和or的意義。AND表示擁有所有許可權才能訪問,OR表示擁有任意一種許可權就能訪問。

jsr250Enabled = true 表示 啟動了JSR-250的註解支援,在方法上使用註解來控制訪問許可權,註解@DenyAll 拒絕所有訪問,註解 @PermitAll 允許所有訪問,註解 @RolesAllowed({"USER", "ADMIN"}) 該方法只要具有"USER", "ADMIN"任意一種許可權就可以訪問。這裡可以省略字首ROLE_,實際的許可權可能是ROLE_ADMIN。

專案演示

我們在記憶體中新建三個使用者,分別是 one/one,two/two,three/three,他們三個的角色分別是 ONE,TWO,THREE,

三個使用者,分別擁有三個不同的角色,下面新建三個頁面,分別賦予三個角色許可權:

三個方法的許可權註解分別使用了三種方式賦予角色。下面我們登入one,檢視效果,one頁面是可以訪問的:

two頁面禁止訪問:

顯示403,forbidden。three頁面也是一樣:

其它兩個使用者可以自行登入測試。

使用者許可權不足處理器

前面介紹登入成功處理器,使用者許可權不足的情況也可以統一進行處理,讓許可權不足的情況下,跳轉到同一個頁面。下面新建類
AuthLimitHandler,實現AccessDeniedHandler介面:

/limit頁面可以自己建立,完成後,在配置類中配置許可權不足處理器:

重啟訪問,就可以看到處理效果:

程式碼地址:https://gitee.com/blueses/spring-boot-security