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) - 权限模型以及权限分配的两种方式的更多相关文章

  1. Shiro权限模型以及权限分配的两种方式

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

  2. Docker学习系列(三)Docker搭建gitlab的两种方式

    一.直接下载docker-ce 1.拉取gitlab/gitlab-ce Randy:~ Randy$ docker pull gitlab/gitlab-ce Using default tag: ...

  3. Spring Boot2 系列教程(十五)定义系统启动任务的两种方式

    在 Servlet/Jsp 项目中,如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行,这里,容易想到web基础中的三大组件( ...

  4. Spring Boot 整合 Shiro ,两种方式全总结!

    在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro. 今天松哥就来和大家聊聊 Spring Boot ...

  5. Go基础系列:Go实现工作池的两种方式

    worker pool简介 worker pool其实就是线程池thread pool.对于go来说,直接使用的是goroutine而非线程,不过这里仍然以线程来解释线程池. 在线程池模型中,有2个队 ...

  6. Linux进程分配内存的两种方式--brk() 和mmap()

    如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...

  7. 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)

    如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...

  8. TP实例化模型的两种方式 M() D()

    TP框架中实例化模型的两种方式 #如果使用自己自定义的函数,那么就用D $mode=D('model'); #如果使用是系统自带的函数,那么就是用M $model=M('model');

  9. SpringCloud系列-整合Hystrix的两种方式

    Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力. 本文目录 一.H ...

随机推荐

  1. Java DES 加解密("DES/EBC/NoPadding")

    private static final Cipher DES_CIPHER; static { try { DES_CIPHER = Cipher.getInstance("DES/ECB ...

  2. VTK中模型的旋转与平移

    当从外界读入STL等三维模型时,其会按照它内部的坐标位置进行显示.因此它的位置和大小是确定的.但是在实际应用中,有可能需要人为地对这个模型在空间中进行旋转.平移或缩放等操作.VTK中有许多和旋转.平移 ...

  3. urllib2特点--urllib2.build_opener对象接口

    # -*- coding: cp936 -*- #python 27 #xiaodeng #urllib2特点--urllib2.build_opener对象接口 import urllib2 imp ...

  4. Linux下Shell元字符的释义

    Linux下shell的巧妙应用,对系统的运维很有四两拨千斤的功效! Shell元字符 注意: () 在当前shell的子shell进程运行命令 {}在当前shell进程运行命令

  5. 【jquery】多日期选择插件easyui date

    1.本次介绍一个好用的 多日期选择插件:EasyUI date,适用于:需要一次性选择多个日期,无需手动一个一个进行添加. 2.效果图: 3.下载地址:http://www.jeasyui.com/d ...

  6. Apache+PHP配置PATHINFO的一个小问题

    使用ThinkPHP示例,设置'URL_MODEL'                 =>  2,发现提示: No input file specified 应该是PATHINFO配置的问题,试 ...

  7. java struts2入门学习---国际化

    一.国际化的概念 1.不同国家的人访问同一个网站,显示的语言不同. 2.对JSP页面进行国际化 属性(properties)文件命名规则:基名---语言--国家如, message_zh_CN.pro ...

  8. Config程序配置文件操作实践进阶之ConfigurationSectionGroup

    今天又进一步对System.Configuration下的ConfigurationSectionGroup类及相关的类与方法进行了研究.发现要构建多层次嵌套的XML标签 则必须用到Configura ...

  9. Linux中断概述

    中断和异常 1.1中断的由来及实质 Linux内核要管理计算机上的硬件设备,首先要和他们通信.而处理器的速度跟外围硬件设备的速度往往不在一个数量级上,因此,如果内核采取让处理器向硬件发出一个请求,然后 ...

  10. 第二篇:呈现内容_第二节:WebControl呈现

    一.WebControl的呈现过程 WebControl派生自Control类,所以WebControl的呈现功能基于Control的呈现逻辑之上,但有了比较大的扩展. 首先,WebControl重写 ...