Shiro系列(2) - 权限模型以及权限分配的两种方式

1. 顶级账户分配权限
用户需要被分配相应的权限才可访问相应的资源。权限是对于资源的操作一张许可证。给用户分配资源权限需要将权限的相关信息保存到数据库。
这些相关内容包含:用户信息、权限管理、用户分配的权限信息(数据模型)

2. 权限模型设计
主体(user、password)
权限(权限名称、资源id)/资源(资源名称、访问url)
角色(角色名称)
角色和权限关系(角色id、权限id)
主体和角色关系(主体id、角色id)

 

3. 权限分配有两种  ​

    ​3.1 基于角色的权限控制

这些角色包含比如:总经理,技术总监,运营总监

不同的角色可以访问到的数据权限不同

例:

if (user.ifHasRole('总经理')) {

    ​// 访问所有资源

}

if (user.ifHasRole('技术总监')) {

    // 访问数据监控

    // 访问服务器信息

}

if (user.ifHasRole('运营总监')) {

    // 访问用户数据

    // 访问报表数据

}

缺点:在经常变更角色权限的管理系统中无法做到动态管理,因为用户主体在整个系统中都是活动对象。

 

举个栗子:

技术总监需要查看用户数据,而用户数据只有运营总监才有权限看,那么此时需要修改代码了:

if (user.ifHasRole('技术总监') || user.ifHasRole('运营总监')) {

    // 访问数据监控

    // 访问服务器信息

}

所以说这样的方式不利于系统的扩展,即可扩展性太弱。

当然如果系统可以让人身兼多只,那么多选角色即可,这个用户同时有技术总监以及运营总监的身份。

但是如果涉及到HR总监甚至实施总监的功能,那么这个用户就同时有4个角色,这样真的好吗?

 

 ​3.2 基于资源的权限控制

资源即功能,也就是当前系统所包含的所有功能模块,这些是不变的

比如button,link,menu等

此时访问这些资源需要permission来鉴权

例:

if (user.ifHasPermission('访问用户数据')) {

    // 访问用户数据

}

if (user.ifHasPermission('访问报表数据')) {

    // 访问报表数据

}

if (user.ifHasPermission('访问用户数据') || user.ifHasPermission('访问报表数据')) {

    // 访问用户数据 和 报表数据

}

 

那么这样的话我们只有针对当前登录的用户,增加相应的资源权限即可,没有必要再去维护代码,减少了程序的代码维护。因为资源在整个系统中是静态对象。

*增减资源权限需要另开一个权限资源分配的模块,在这个模块中设置用户的资源权限即可,一般由顶级账户来操作。

<未完待续...>

具体内容同步更新文章以及视频到微信公众号,知乎,豆瓣,cnblogs,今日头条以及新浪微博,以官网itzixi.com为主

 

时间: 2024-09-20 06:51:28

Shiro系列(2) - 权限模型以及权限分配的两种方式的相关文章

Android无需申请权限拨打电话的两种方式_Android

Android打电话有两种实现方法: 第一种方法,拨打电话跳转到拨号界面.源代码如下: Intent intent = new Intent(Intent.ACTION_DIAL); Uri data = Uri.parse("tel:" + "135xxxxxxxx"); intent.setData(data); startActivity(intent); 第二种方法,拨打电话直接进行拨打,但是有些第三方rom(例如:MIUI),不会直接进行拨打,而是要用户进

Android无需申请权限拨打电话的两种方式

Android打电话有两种实现方法: 第一种方法,拨打电话跳转到拨号界面.源代码如下: Intent intent = new Intent(Intent.ACTION_DIAL); Uri data = Uri.parse("tel:" + "135xxxxxxxx"); intent.setData(data); startActivity(intent); 第二种方法,拨打电话直接进行拨打,但是有些第三方rom(例如:MIUI),不会直接进行拨打,而是要用户进

C++程序设计实践学材系列(12)——1.2.4 Code::Blocks运行程序的两种方式

回到系列文章的目录--[系列文章目录] 回到本章目录--[第1章目录]   1.2.4 Code::Blocks运行程序的两种方式 微课件1.2展示的程序运行方式,只要连编(Build)成功了,一点运行(Run)按钮,看结果就可以了. 目的达到了.但是程序是如何执行的,作为学习者,我们需要知道"内幕".作为开发者,尤其是当程序执行结果与预期的不一样时,需要找到问题究竟出在什么地方. Code::Blocks提供了另外一种运行程序的方式--单步执行,可以由编程者控制,逐条执行程序. 为了

从零开始学_JavaScript_系列(20)——js系列&amp;lt;7&amp;gt;(函数原型的两种声明方式、函数的作用域)

  (20)函数的原型 ①Object.create(obj) 根据原型obj创建一个对象: 例如: var obj = {     a: 1 } var o1 = Object.create(obj); console.log(obj); console.log(o1); 输出为: Object {a: 1} Object {}   ②使用构造函数方法: 使用构造函数,通过new来创建一个实例(之前有,这里略)   ③ ①和②之间的区别: 通过②的继承: var obj = {     a:

共享权限与NTFS权限的设置与管理

  当一个对象(如文件夹)同时使用了共享权限与NTFS权限时,它们之间有什么关系? 只有共享资源存储在使用NTFS文件系统的分区时,才会同时具有共享与NTFS权限.在同时具有共享与NTFS权限时,共享权限将成为第一道防线.有权限访问共享资源的账户,将首先受到共享权限的限制,共享权限将定义登录账户对共享资源最大的访问范围.作为第二道防线的NTFS权限,这个权限可以定义精细的权限. 当共享资源(如ABC文件夹)的共享权限与NTFS权限设置相同时,如对Everyone组都具有读取权限时,两种权限将互不

一种基于主客体模型的权限管理框架

用户权限体系,在大多数的应用系统中都是需要的.而用户权限体系在不同的应用场景,其适应要求也都有不同.因此,要做一个普适性较好的权限管理系统是非常困难的. 为此,本文提出一种新的权限管理及分配模型,即兼顾通用性,又兼顾应用的个性化. 1.基本概念的抽象 在权限框架中,有用户.角色.组织机构.部门.岗位.菜单.操作.功能等等,甚至组织机构还要分成几个维护,有行政维护.账务维度等等,把这么复杂的模型在一个系统中都实现,会有以下几种情况出现: a.这个太好了,正是我要的(命中概率约为0) b.功能还不错

基于RBAC模型的权限管理系统的设计和实现

摘要:提出了基于RBAC模型的权限管理系统的设计和实现方案.介绍了采用的J2EE架构的多层体系结构设计,阐述了基于角色的访问控制RBAC模型的设计思想,并讨论了权限管理系统的核心面向对象设计模型,以及权限访问.权限控制和权限存储机制等关键技术. 关键词:权限管理系统:角色:访问控制:RBAC模型:J2EE:LDAP 0 引言 管理信息系统是一个复杂的人机交互系统,其中每个具体环节都可能受到安全威胁.构建强健的权限管理系统,保证管理信息系统的安全性是十分重要的.权限管理系统是管理信息系统中可代码重

为什么大家都用RBAC权限模型??

问题描述 一提到权限模型都是RBAC,ACL什么的,请问各位RBAC到底有什么好处呢??直接给用户赋权不行吗??非要加一层角色??? 问题补充:yutian2211 写道 解决方案 功能简单,也确认将来不会有什么功能扩展,任务又紧等因素,也是可以让样做的就像用不用spring都一样可以开发一个web项目解决方案二:suziwen,说得很对....如果要扩展功能呢?你不会是要把每个user都拿出来给予权限?role下,就很简单了,只要让这个role有这个权限就可以了解决方案三:说实话,没有接触过R

Oracle 用户、对象权限、系统权限

--================================ --Oracle 用户.对象权限.系统权限 --================================   一.用户与模式     用户:对数据库的访问,需要以适当用户身份通过验证,并具有相关权限来完成一系列动作        SYS用户,缺省始终创建,且未被锁定,拥有数据字典及其关联的所有对象        SYSTEM用户,缺省始终创建,且未被锁定,可以访问数据库内的所有对象     模式(schema):是某个