Fork me on GitHub
操作权限

第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,并且选择录入人员组。

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

 

同理可以根据自己的系统配置相应的资源及操作管理。

 

 
分类: java
posted on 2012-06-11 15:56  HackerVirus  阅读(232)  评论(0编辑  收藏  举报