用戶授權
前面討論過,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頁面可以自己創建,完成后,在配置類中配置權限不足處理器:

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


