1. 程式人生 > >shiro二之授權驗證

shiro二之授權驗證

原文地址:https://blog.csdn.net/sharetop/article/details/50195609

繼續上回,昨天我們發現,一旦我們完成Spring的必要配置之後,Shiro在認證方面的程式碼量是非常少的。今天我們來看看關於授權(Authorization),Shiro又是如何簡化程式碼的。 
Shiro提供了三種授權驗證模式。

註解,使用方便,控制方法是否能被呼叫。
JSP標籤,也很方便,可以在頁面上根據許可權選擇顯示的內容。
編碼,略顯麻煩,但是靈活度和自由度都是最高的。
我們可以根據需要,靈活選擇配置這三種驗證模式,比如一般情況下,我們在Controller中配置註解,限制某些方法只能被有許可權的使用者訪問。OK,沒問題,另一方面,我們又需要在頁面上根據當前登入使用者的許可權,有選擇的顯示部分內容,這時候,JSP標籤就派上用場了。再進一步,在我們的業務裡,有些安全可能會涉及到操作的資料,比如,同樣是銷售人員登入進來,看到選單一樣,但是我們只允許張三看『北京』的資料,李四看『廣東』的資料,這個時候,我們需要使用Shiro提供的許可權方法,用編碼的方式做最靈活的定製了。

先看註解方式的許可權,程式碼也很簡單。

//@RequiresRoles("administrator")
@RequiresPermissions("system:admin")
@RequestMapping(value="/admin",method=RequestMethod.GET,headers = {"Accept=text/html"})
public ModelAndView showAdmin(){
    ModelAndView mv = new ModelAndView();

    String cnt = RandomUtils.nextLong()+"";
    mv.addObject("message", cnt);

    mv.setViewName("admin");
    return mv;
}

與我們常用的Spring中的註解沒有太大差別,所以使用起來也是非常方便的。除了上面示例中『要求指定的角色』以及『要求指定的許可權』,還有『requiresUser』要求是登入使用者或者通過rememberme進來的使用者也算。另外『requiresAuthentication』就是要求你必須是新鮮登入進來的才行。

不過,如果要使用註解,你在Spring的配置檔案中需要先加上這個Shiro提供的註解切面,否則註解是不起作用的。

<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
   <property name="securityManager" ref="securityManager"/>
</bean>


再來看看JSP標籤,我們一般的JSP中都會使用JSTL的標籤(見我們的示例),那麼要使用Shiro的JSP標籤,類似地加上標籤庫先:

<%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

然後,在JSP程式碼中,輸入

<p>
<shiro:hasRole name="administrator">
<h4>管理員才能看到我</h4>
</shiro:hasRole>

<shiro:hasPermission name="system:view">
需要有system:view許可權
</shiro:hasPermission>

</p>

最後,我們來看看用程式碼實現授權管理。

String perm = “printer:print:laserjet4400n”;

if(currentUser.isPermitted(perm)){
    //show the print button?
} else {
    //don’t show the button?
}

這是官方教程上的例子,類似的方法還有很多,一般分為兩類,一類是 isXXXXX,hasXXXXX,返回都是boolean,還有一類是checkXXXXX,不返回是否有許可權,而是如果沒許可權直接丟擲異常AuthorizationException,可以根據需要選擇使用。