關於操作權限


第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,並且選擇錄入人員組。

登錄之后可以看到只有人員管理資源,資源下只有新增和修改的操作。

 

同理可以根據自己的系統配置相應的資源及操作管理。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM