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,可以根據需要選擇使用。