来自:编程新说

很多时候,需要对一些事物进行控制,如一个房间,为了不让人随便进,通常会装一把锁,如果要想进入,你必须得有一把钥匙,且还得和这个锁匹配才行。

基于此做一个抽象,其实包含三方面内容:

1)一个是被控制的事物,通常就算资源。

2)一个是想访问这些资源的人所必须拥有的东西,通常就算凭证。

3)还有一个就是进行凭证和资源的匹配。

Web应用中的资源

网络时代绝大多数都是web应用。web应用的一大特点就是Client和Server。客户端发起一个请求,服务器就给出一个响应。

对客户端的要求只有一个,那就是要知道请求对应的URL。客户端请求不同的URL就可以得到不同的内容,或者反过来说,客户端为了得到不同的内容只要请求不同的URL即可。

这些内容可以认为是服务器开放给客户端的资源,所以站在客户端的角度,服务器上的资源就是由许多URL组成的,因为客户端只能通过URL的方式和服务器打交道。

URL可以说是一个底层本质的东西,它的上面会有很多不同的展现形式:

菜单可以对应URL

页面可以对应URL

按钮可以对应URL

Ajax可以对应URL

服务API可以对应URL

文件下载可以对应URL

静态文件css、js、images可以对应URL

这些就是通常我们见到的资源,它们就是要被控制访问的事物。

把凭证授给用户

凭证这个东西的作用,大家都很熟悉,就是可以用来证明一个事物的合法性。比如一个身份证可以证明你是一个合法公民。一张车票可以证明你是一个合法乘客。

但是对凭证的存在形式,其实并没有什么硬性规定,因为随着时间的推移,它是会变的,也就是说具有阶段性。

就拿锁来说,它的凭证以前是一把钥匙,后来变成一串数字密码,再后来变成一个指纹,现在又变成一张人脸或一个声纹,再往未来发展,可能就是一种意念了。

web应用中的资源就是URL,我们可以把这个URL直接作为凭证授予用户,只需把这些授予关系存储起来即可,说白了就是,哪个用户可以访问哪些URL。

或者也可以把这些URL进行等价变形,把变形后的产物授予用户,总之,只要能建立起合理的映射关系就行了。

角色出现的必然性

假如有一个新闻系统,为了让某人能顺利的发新闻,需要由技术人员授予她一大堆的URL。这样一个“简单”的事情中,就存在两个潜在的弊端。

一个是必须由技术人员来做,因为非技术人员可能连URL这个词都不知道是什么。一个是一大堆的URL,太多了,操作麻烦,还可能漏掉某个。

究竟由谁发新闻,这是业务和管理上的事情,不应该由技术来做,他们不做的原因是因为门槛太高,所以技术应该想办法来降低工作的门槛。

可能领导觉得现在的新闻发布人员工作很认真,于是让她去审核新闻了,又来了一个新的新闻发布人员。这下又要“折腾”技术人员了。

技术需要先把她的发布新闻URL去掉,授给她审核新闻的URL,然后再把发布新闻的URL授给新来的人员。可能过两天又来了一个新闻发布人员。

这可简直要了技术人员的“命”了,所以技术应该想办法来降低工作的繁琐性,绝对是利人又利己。

在计算机里,解决此类问题的一个“标准指导方针”就是,抽象和封装。抽象出一层来,把复杂的东西封装起来。

就是让不该看的人看不到他不该看的东西,只让他看到他该看到的东西。就像同一个事物在不同人眼里是不一样的。

一栋大楼,在设计人员眼里就是一堆图纸,在工程人员眼里就是一堆结构和承重计算的公式,在建筑工人眼里就是一堆钢筋和混凝土,在装修人员眼里就是毛坯房,在业主眼里就是他自己未来的家。

最终角色这个东西就是被抽象出来的一层,它起到过渡的作用,从这一层向下是技术人员负责的,从这一层向上是业务管理人员负责的。

技术人员预定义好一些角色,比如新闻发布员、新闻审核员,然后把和发布相关的所有URL授予发布员这个角色,把和审核相关的所有URL授予审核员这个角色。

剩下的工作就交给业务管理人员来做,他们把角色授予某个人,只需一步即可,也不涉及什么技术知识。这真是各管各的,两全其美。

其实这个角色就是上面提到的一堆URL的等价变形,最终起到的也是一个传递映射关系的桥梁作用。

凭证和资源的匹配方式

在持有凭证去访问资源的时候需要进行凭证和资源的匹配。就像进考场要看准考证、上车前要验票一样。

凭证的存在形式不同,匹配的方式也不同,如果是钥匙,需要机械匹配。如果是密码,需要相等性匹配。

如果是指纹、图像、声纹,需要的是概率性匹配,因为这些东西貌似无法相等,只有一个匹配度。

对于web应用的URL,只有用户访问时才需要匹配,我们就在请求必经的路上设置一到多道关卡进行拦截,常用的就是过滤器和拦截器。

在被拦截以后,从请求中解析出本次访问的URL,从当前登陆用户信息中拿到具有的角色和能访问的URL,然后按自己设定的一套逻辑去匹配。

如果匹配成功就放行,会自动进行后续处理。匹配不成功就禁止通行,告诉他不能通行的原因,结束本次访问。

基于角色的访问控制

其实上面讲的就是基于角色的访问控制的原理。原理很简单,如果没有特殊要求的话,实现也不难。

就是经典的五张表:

1)权限表,也称资源表,记录所有的资源URL。

2)角色表,记录所有的角色。

3)角色权限表,记录每个角色都能访问哪些权限。

4)用户表,记录所有用户。

5)用户角色表,记录每个用户被授予的角色。

按实际需求决定的部分:

1)一个用户是只能有一个角色,还是可以有多个,这个依托用户角色表即可实现。

2)角色之间是否可以继承,是单继承还是多继承,这个需要一个单独的角色继承表来存储。

两个特殊的事物:

1)一个是没有任何限制的公共资源,如js、css、images等,可以设置一个白名单,把它们放入其中,这些URL相当于“免检”。

2)一个特殊的用户,如超级管理员,这个需要在用户表进行标识,遇到它后直接放行,因为它也是“免检”。

是否选择现成的框架

常用的现成的框架就是Spring Security和Apache Shiro。它们属于上手不难,想用好却不简单的那种。

我觉得可以按以下情况来选择:

1)有专门团队或人员维护的,可以选择从零研发或基于框架的深度扩展。

2)没有专人负责,也不想麻烦的,建议不要用框架,应该自己写代码简单实现。

3)不怕麻烦的,爱研究的,可以选择框架,掌握使用方式,明白运行原理,看看底层源码。

总之,一定要做到可控,特别是自身或团队在条件不允许的情况下,千万别去捅马蜂窝。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

基于角色的访问控制(RBAC)相关推荐

  1. 针对访问控制列表ACL 与 基于角色的访问控制RBAC进行简单介绍

    2019独角兽企业重金招聘Python工程师标准>>> 访问控制列表(Access Control List,ACL) ACL是最早也是最基本的一种访问控制机制,它的原理非常简单:每 ...

  2. [ Azure - IAM ] Azure 中的基于角色的访问控制 (RBAC) 与基于属性的访问控制 (ABAC)

    在任何公司中,网络用户必须先经过身份验证和授权,然后才能访问可能导致安全漏洞的系统部分.获得授权的过程称为访问控制.在本文中,我将讨论管理系统访问控制的两种主要方法--基于角色的访问控制 (RBAC) ...

  3. RBAC 基于角色的访问控制

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用 ...

  4. 基于角色的访问控制模型(RBAC)——学习笔记

    基于角色的访问控制模型(RBAC),英文全称Role-Base Access Control,是20世纪90年代推出的一种访问控制模型,模型通过角色(Role)将用户(User)和访问许可(Permi ...

  5. k8s、ServiceAccount权限详解、RBAC 详解(基于角色的访问控制),常用操作指令

    文章目录 Service Account应用示例 RBAC 详解(基于角色的访问控制) 创建一个角色(role)---权限 实验二 常用操作指令 Service Account应用示例 概念图权限关系 ...

  6. RBAC(基于角色的访问控制权限的基本模型)

    (一)基本概念 1.定义 RBAC(Role-Based Access Control),也就是所谓的**"基于角色的访问控制权限"**. 2.优势 在RBAC中,用户不再直接与权 ...

  7. .Net Core实战之基于角色的访问控制的设计

    前言 上个月,我写了两篇微服务的文章:<.Net微服务实战之技术架构分层篇>与<.Net微服务实战之技术选型篇>,微服务系列原有三篇,当我憋第三篇的内容时候一直没有灵感,因此先 ...

  8. Azure与Scott Guthrie:Azure安全中心和基于角色的访问控制

    InfoQ有幸采访了Microsoft执行副总裁Scott Guthrie,请他谈了谈Azure以及他最近的Red Shirt Dev Tours(红杉开发之旅)[译注1].昨天我们谈到了Azure提 ...

  9. 基于角色的访问控制'的权限管理的数据库的设计实现

    RBAC基于角色的访问控制的权限管理系统数据库设计与实现 use [master] go -- 检查数据库 [RBAC]是否存在,如果存在则删除(只测试用,不然会丢数据.) -- Search fro ...

最新文章

  1. ppt批量缩略图_拒绝加班系列:100个PPT常用快捷键,让PPT制作快到起飞
  2. 数造未来——探索大数据的应用价值
  3. 【小白学习keras教程】八、Sequential Model和模型函数API两种模型建立方法
  4. Linux命令find查询suid和sgid
  5. Apache Dubbo的使用
  6. 获取字符串中不重复的第一个字符
  7. MAPGIS与ARCVIEW之间的文件转换技巧。(转载自当当吧网络驿站)
  8. 基于PaddleOCR史上最全车牌号识别实现(一)
  9. 熊猫直播破产背后:王思聪不肯再借钱,谋求卖身腾讯未果
  10. 艾永亮:2平米的Manner如何战胜200平米的星巴克
  11. 08_基于IP的伪装
  12. 基于k-means的大数据客户细分 - python 数据挖掘
  13. 资深工程师PCB经验介绍
  14. 测试连接--ping (IP地址,网址,主机名)
  15. 谷歌seo工具有哪些
  16. 天数怎么换算成月_excel表中,怎么把日期数转换成月份数呢?
  17. iOS面试准备 - ios篇
  18. 案例:京东登录页面css创建
  19. Tekton 的供应链安全工具 Chains
  20. ubuntu server 12.04.2 安装桌面之后没有上面的工具条

热门文章

  1. HDU7059-Counting Stars 线段树 (区间加最低位置,区间减最高位)
  2. szu 寒训 day#3 ST表 和 LCA问题 附例题 菜鸡解法
  3. virtualbox 创建桥接网络_VirtualBox桥接网络的简单配置,让虚拟机直接访问网络
  4. 大学计算机基础知识点_自学录——大学计算机基础
  5. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)
  6. 一元二次方程用c语言代码,一元二次方程求解程序完整代码
  7. 数据结构c语言函数大全,数据结构习题库(c语言版).doc
  8. 257.二叉树的所有路径
  9. P1087 FBI树
  10. 任铄 计算机操作系统,计算机组成与体系结构-CSDN.PDF