关于操作权限

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏happyJared

程序员神器,IntelliJ IDEA 2018.1 正式发布

3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再次让人眼前一亮:什么,还能这么玩?

11310
来自专栏Web项目聚集地

Javascript中的异步

9020
来自专栏程序员叨叨叨

compileSdkVersion 'android-24' requires JDK 1.8 or later to compile

今天,好久没有写Android程序的我突发奇想,想简单写一个每日任务APP。好的!新建工程->写好代码框架->开启模拟器->运行!哎哎哎?!那啥!咋报错了嘞?!...

13140
来自专栏vue学习

6.vue-router之命名路由和命名视图

① 官方文档的解释:https://router.vuejs.org/zh/guide/essentials/named-routes.html 就是在rou...

11710
来自专栏Java工程师日常干货

Redis高级特性介绍及实例分析Redis基础类型回顾 Redis发展过程中的三种模式:主从、哨兵、集群 哨兵模式 Redis的简单事务 Redis持久化机制 发布与订阅消息 Redis案例设计

本文将为大家介绍Redis的一些高级特性以及结合一个具体的实际案例来对Redis进行设计分析。

21620
来自专栏社区的朋友们

TAF 必修课(六):容错

上一节简单提到了客户端在选取 Invoker 节点时,会对 Invoker 列表执行死活检查,屏蔽掉一定时间内异常的节点,从而达到容灾的目的。下面对 TAF 容...

41900
来自专栏Golang语言社区

go语言最快最好运用最广的web框架比较(大多数人不了解的特性)

如果你为自己设计一个小应用程序,你可能不需要一个Web框架,但如果你正在进行生产,那么你肯定需要一个,一个好的应用程序。

62540
来自专栏企鹅号快讯

JDBC编程

前面我们已经讨论了数据库的安装和简单的使用,还没完成的可以先去Mysql的安装和Mysql数据库的简单操作回顾一下哦!今天我们来简单学习JDBC编程的准备和链...

35480
来自专栏ChaMd5安全团队

Pentest box系列——爬坑记(2)

Pentest box 是啥,就不说了。直接来正题,其实吧,盒子的msf我并不是很常用。不过一直以来,使用盒子的朋友很多都说,msf不能更新或者进行更新就会出...

35780
来自专栏IMWeb前端团队

FIS源码解析-整体架构

本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载 序言 这里假设本文读者对FIS已经比较熟悉,如还不了解,可猛击官方文档。 ...

23060

扫码关注云+社区

领取腾讯云代金券