第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,并且选择录入人员组。
登录之后可以看到只有人员管理资源,资源下只有新增和修改的操作。
同理可以根据自己的系统配置相应的资源及操作管理。