Shiro 集成 Spring 之註解

前言

集成 Spring 後我們通過過濾器鏈來配置每個 URL 需要的權限,但當配置多了以後就會不方便,而且只支持 URL 級別的配置。

好在 Shiro 提供了相應的註解用於權限控制,此處使用了 Spring MVC 來測試Shiro註解,當然 Shiro 註解不僅僅可以在 web 環境使用,在獨立的JavaSE 中也是可以用的,此處只是以 web 爲例了。

開啓註解配置

首先我們需要在 Spring Web 的配置文件 spring-web.xml 中加入以下內容來開啓 Shiro 的註解支持 :

<aop:config proxy-target-class="true"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    <property name="securityManager" ref="securityManager"/>
</bean>

簡單演示

接着我們就可以使用註解來配置權限:

@RestController
public class AuthorizationController {

    @RequestMapping("/role1")
    @RequiresRoles("user")
    public String role1() {
        return "success";
    }

    @RequestMapping("/role2")
    @RequiresRoles("admin")
    public String role2() {
        return "success2";
    }
}

訪問 role1 方法需要當前用戶有 user 角色,role2 方法需要 admin 角色。

當驗證失敗時,會拋出 UnauthorizedException ,我們可以使用 Spring 的 ExceptionHandler 來進行異常處理:

@ExceptionHandler(UnauthorizedException.class)
public String processUnauthorizedException(UnauthorizedException e) {
    return e.getMessage();
}

更多註解

當然不止有 @RequiresRoles 用來驗證角色,Shiro 還提供了以下註解:

@RequiresAuthentication

驗證用戶是否登陸,等同於方法 subject.isAuthenticated() 。

@RequiresUser

驗證用戶是否被 記憶,即登陸成功或 RememberMe 狀態。等同於方法 : subject.isAuthenticated()subject.isRemembered()

@RequiresGuest

僅未登錄狀態可訪問,與 @RequiresUser 完全相反。

@RequiresPermissions

驗證是否具備權限,可通過參數 logical 來配置驗證策略:

// 擁有 admin 或 user 角色即可
@RequiresPermissions(logical = Logical.OR,value = {"admin", "user"})
// 需同時具備 admin 與 user 角色
@RequiresPermissions(logical = Logical.AND,value = {"admin", "user"})

RequiresRoles 同樣可以配置驗證策略。

小結

我們可以通過註解配置來更方便的實現權限配置,且這些方法不僅可以配置在 Controller 層,還可以在 Service 層,DAO 層等,只不過需要通過 IOC 容器來獲取對象才能使用。

本章代碼地址 : https://github.com/zhaojun1998/Premission-Study/tree/master/Permission-Shiro-10/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章