第1章 引言
1.1 編寫目的
詳細說說操作權限並且在sshpermissions中是如何處理及使用操作權限的。
1.2 關於操作
這里所說的操作權限是指在我們工作中,比如張三“添加”了一條員工的記錄,李四“修改”了哪條信息,管理中對某個角色進行了“授權”。就是我們在系統中所看到的所有的操作。
1.3 Shiro中如何處理
Shiro 將權限定義為一個規定了明確行為或活動的聲明。這是一個在應用程序中的原始功能語句,僅此而已。權限是在安全策略中最低級別的構造,且它們明確地定義了應用程序只能做“什么”。
它們從不描述“誰”能夠執行這些動作。
一些權限的例子:
l 打開文件
l 瀏覽'/user/list'頁面
l 打印文檔
l 刪除'jsmith'用戶
規定“誰”(用戶)允許做“什么”(權限)在某種程度上是分配用權限的一種習慣做法。這始終是通過應用程序數據模型來完成的,並且在不同應用程序之間差異很大。
例如,權限可以組合到一個角色中,且該角色能夠關聯一個或多個用戶對象。或者某些應用程序能夠擁有一組用戶,且這個組可以被分配一個角色,通過傳遞的關聯,意味着所有在該組的用戶隱式地獲得了該角色的權限。
如何授予用戶權限可以有很多變化——應用程序基於應用需求來決定如何使其模型化。
Wildcard Permissions
上述的權限例子,“打開文件”、“瀏覽'/user/list'頁面”等都是有效的權限語句。然而,將這些解釋為自然語言字符串,並判斷用戶是否被允許執行該行為在計算上是非常困難的。
因此,為了使用易於處理且仍然可讀的權限語句,Shiro 提供了強大而直觀的語法,我們稱之為WildcardPermission。
Simple Usage
假設你想要保護到貴公司打印機的訪問,使得某些人能夠打印到特定的打印機,而其他人可以查詢當前有哪些工作在隊列中。
一個極其簡單的方法是授予用戶"queryPrinter"權限。然后你可以檢查用戶是否具有queryPrinter 權限通過調用:
subject.isPermitted("queryPrinter")
這(很大程度)相當於
subject.isPermitted( new WildcardPermission("queryPrinter"))
但遠不只這些。
簡單的權限字符串可能在簡單的應用程序中工作的很好,但它需要你擁有像"printPrinter","queryPrinter","managePrinter"等權限。你還可以通過使用通配符授予用戶"*"權限(賦予此權限構造它的名字),這意味着他們在整個應用程序中擁有了所有的權限。
但使用這種方法不能說用戶擁有“所有打印機權限”。由於這個原因,Wildcard Permissions(通配符權限)支持多層次的權限管理。
Multiple Parts
通配符權限支持多層次或部件(parts)的概念。例如,你可以通過授予用戶權限來調整之前那個簡單的例子。
printer:query
在這個例子中的冒號是一個特殊字符,它用來分隔權限字符串的下一部件。
在該例中,第一部分是權限被操作的領域(打印機),第二部分是被執行的操作(查詢)。上面其他的例子將被改為:
printer:print
printer:manage
對於能夠使用的部件是沒有數量限制的,因此它取決於你的想象,依據你可能在你的應用程序中使用的方法。
Multiple Vaules
每個部件能夠保護多個值。因此,除了授予用戶"printer:print"和"printer:query"權限外,你可以簡單地授予他們一個:
printer:print, query
它能夠賦予用戶print 和query 打印機的能力。由於他們被授予了這兩個操作,你可以通過調用下面的語句來判斷用
戶是否有能力查詢打印機:
subject.isPermitted("print:query")
該語句將會返回true。
All Values
如果你想在一個特定的部件給某一用戶授予所有的值呢?這將是比手動列出每個值更為方便的事情。同樣,基於通
配符的話,我也可以做到這一點。若打印機域有3 個可能的操作(query,print 和manage),可以像下面這樣:
printer:query, print, manage
簡單點變成這樣:
printer:*
然后,任何對"printer:XXX"的權限檢查都將返回true。以這種方式使用的通配符比明確地列出操作具有更好的尺度,如果你不久為應用程序增加了一個新的操作,你不需要更新使用通配符那部分的權限。
最后,在一個通配符權限字符串中的任何部分使用通配符token 也是可以的。例如,如果你想對某個用戶在所有領域(不僅僅是打印機)授予"view"權限,你可以這樣做:
*:view
這樣任何對"foo:view"的權限檢查都將返回true。
第2章 如何處理
2.1 編寫標簽
為什么使用自定義標簽?
在頁面上不可能引用非常多的shiro標簽,這樣的頁面會顯得很亂,而且非常不容易記,對於開發人中來說無謂的復制粘貼都是很沒有必要的。
標簽位置?
到WEB-INF目錄下找tgEasyuiTag.tld。
如何使用?
在jsp頁面上引入
<%@ taglib uri="http://com.tgyt.com.cn/tag/easyui" prefix="tgEasyui" %>
比如新增操作:
<tgEasyui:easyuiButton iconCls="icon-add" method="newItem()" permission="action:add" operationName="新增"/>
這個是對easyui的封裝,如果使用其它的ajax框架可以針對自己的進行二次封裝。
action:add是什么?
這個是在資源管理和操作管理中分別設置的別名。
2.2 處理程序
if(!"".equals(this.permission)){ Subject subject = SecurityUtils.getSubject(); if(subject.isPermitted(this.permission)){ try { if(EASYUIBUTTON.equals(type)){ pageContext.getOut().println(createEasyuiButton()); }else if(IMAGEBUTTON.equals(type)){ pageContext.getOut().print(createImageButton()); } } catch (IOException e) { e.printStackTrace(); } } }
第3章 實例
3.1 場景描述
管理人員可以處理全部的操作及資源,而錄入人員只能處理新增和修改的操作,其它的工作錄入人員都不能處理。
添加錄入人員角色:
錄入人員,主要負責錄入和修改,不具備其它權限
在管理組下邊新增錄入人員角色:
將組和角色綁定:
點擊角色管理,給角色分配資源和操作:
給錄入人員分配對人員的操作管理
分配完資源之后分配操作:
保存結果。
在人員管理里加入用戶testluru,並且選擇錄入人員組。
登錄之后可以看到只有人員管理資源,資源下只有新增和修改的操作。
同理可以根據自己的系統配置相應的資源及操作管理。