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为主
Shiro系列(2) - 权限模型以及权限分配的两种方式的更多相关文章
- Shiro权限模型以及权限分配的两种方式
1. 顶级账户分配权限用户需要被分配相应的权限才可访问相应的资源.权限是对于资源的操作一张许可证.给用户分配资源权限需要将权限的相关信息保存到数据库.这些相关内容包含:用户信息.权限管理.用户分配的权 ...
- Docker学习系列(三)Docker搭建gitlab的两种方式
一.直接下载docker-ce 1.拉取gitlab/gitlab-ce Randy:~ Randy$ docker pull gitlab/gitlab-ce Using default tag: ...
- Spring Boot2 系列教程(十五)定义系统启动任务的两种方式
在 Servlet/Jsp 项目中,如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行,这里,容易想到web基础中的三大组件( ...
- Spring Boot 整合 Shiro ,两种方式全总结!
在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro. 今天松哥就来和大家聊聊 Spring Boot ...
- Go基础系列:Go实现工作池的两种方式
worker pool简介 worker pool其实就是线程池thread pool.对于go来说,直接使用的是goroutine而非线程,不过这里仍然以线程来解释线程池. 在线程池模型中,有2个队 ...
- Linux进程分配内存的两种方式--brk() 和mmap()
如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...
- 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)
如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...
- TP实例化模型的两种方式 M() D()
TP框架中实例化模型的两种方式 #如果使用自己自定义的函数,那么就用D $mode=D('model'); #如果使用是系统自带的函数,那么就是用M $model=M('model');
- SpringCloud系列-整合Hystrix的两种方式
Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力. 本文目录 一.H ...
随机推荐
- Flash XSS 漏洞详解 根治的好办法
本文的目的是深层次的分析Flash的ExternalInterface的XSS漏洞,并提出比较有效的解决方案. 首先,我们看看什么情况下,会出现XSS. 第一种情况: 把flas ...
- Html Agility Pack - API
Html Agility Pack - APIParserSelectorsManipulationTraversingWriterUtilitiesAttributes HTML Parser HT ...
- 数据库行列转换sql
经常折腾数据库,常常遇到数据库行列转换的问题,下面就用一个小例子来演示下如何进行行列转换. 1.创建一张表 CREATE TABLE [android_source]( [CREATETIME] [d ...
- 有可能挑战Java优势的四种技术
2012-02-22 Java是一种杰出的产业开发语言,这是因为它带来了伟大的统一和对事实上以前并不存在的重要标准的关注.但是和所有语言一样,Java将来也会褪色.依据我做的超越Java的研究,一个 ...
- Go map中一个很重要的特性
先看一段代码: func main() { m := make(map[int]string) m[1] = "a" m[2] = "b" m[3] = &qu ...
- commit your changes or stash them before you can merge
今天用git pull来更新代码,遇到了下面的问题: 今天git pull 出现以下问题 Please commit your changes or stash them before you mer ...
- 使用requests库实现多线程下载
多线程下载主要用到http请求中的header Content-Length:资源长度,用于确认资源的总长度,从而便于规划每个线程的任务量 Range:bytes=beg1-end1;beg2-end ...
- 【RS】List-wise learning to rank with matrix factorization for collaborative filtering - 结合列表启发排序和矩阵分解的协同过滤
[论文标题]List-wise learning to rank with matrix factorization for collaborative filtering (RecSys '10 ...
- IOCP笔记
IOCP是win32下的异步IO,利用线程池来异步处理IO请求. 这里要分析一下异步调用,跟同步调用不同,异步调用 调用了就马上返回,但是还留下个话:有事情了马上通知我,我会处理滴.恩恩,这很符合我的 ...
- 如何使用SetTimer
1.SetTimer定义在那里? SetTimer表示的是定义个定时器.根据定义指定的窗口,在指定的窗口(CWnd)中实现OnTimer事件,这样,就可以相应事件了. SetTimer有两个函数.一个 ...