权限系统的基本概念和架构

简介

权限系统是咱们在系统设计和应用中一种很是常见的系统。通常来讲权限系统的功能分为认证和受权两种。认证就很是简单的,验证完用户名密码就算认证成功,而受权里面的套路就不少了,本文将会详细讲解权限系统中的一些基本概念和设计上面要注意的问题,但愿你们可以喜欢。web

受权流程

在受权流程中主要有三个部分,分别是资源管理,权限和策略管理,策略的执行。服务器

先看下资源管理:架构

首先咱们须要建立一个资源服务器,而后在资源服务器中建立各类资源,最后对各类资源设置一些scope,scope就是跟资源相关的的一些可执行的操做。ide

什么是资源呢?资源能够是一个web页面,一个RESTful资源,一个文件等等。设计

举个例子,假如咱们有一个图书馆资源服务器,图书馆有一个本《人月神话》的书,那么这本书就被称做资源。接下来咱们须要为这个资源定义一些可操做性的scope,或者说策略。好比说只有本校的学生才可以借阅这本书。3d

当咱们定义好资源以后,就须要对这些资源进行一些权限和策略的设置,这就须要进行权限和策略管理。code

看下权限和策略管理的流程:orm

首先是建立策略,而后定义权限,最后将权限和策略进行关联。server

策略就是定义的一些去访问某些资源或者权限的操做,策略是和具体的权限是分离的,策略只制定了在什么状况下能够作(某些事情),或者在某些状况下不能作(某些事情),这些事情就是后面建立的权限。对象

好比说,拥有user角色能够作什么事情,就是一种策略。

策略定义好了,咱们就能够建立权限了,权限很好理解,好比:借《人月神话》的书的权限。

咱们把策略和权限组合起来就是:拥有user角色的,能够借《人月神话》这本书。

通用的策略有不少种,好比说基于属性的访问策略,基于角色的访问策略,基于用户的访问策略,基于上下文的访问策略,基于时间的访问策略,基于规则的访问策略或者其余的自定义策略等。

一般来讲,基于角色的访问策略role-based access control (RBAC)是最经常使用的。

咱们把用户赋予相应的角色,而后在访问资源的时候根据不一样的角色策略来执行不一样的permission操做。

虽然RBAC很是有用,用途也很是普遍,可是它仍是有下面的几个缺点:

  1. 资源和角色是强绑定的,若是咱们对角色进行一些添加,删除和修改操做,将会影响到全部相关联的资源。
  2. 对于角色的修改则可能须要咱们对代码进行修改。
  3. 若是你的应用程序很是大的话,使用RBAC可能会出现一些错误。
  4. RBAC的灵活性不够强,不可以作到更加细粒度的权限控制。

最后,咱们看一下策略的执行。

策略的执行就是真正的在资源服务器上执行相应的受权工做。通常来讲咱们在资源服务器中有一个 Policy Enforcement Point (PEP)来和受权服务器进行交互,根据受权服务器返回的受权信息来执行相应的资源操做。

权限系统的架构

先看一张权限系统的基本架构图:

其中有下面几个关键组件:

  • PAP全称是Policy Administration Point,它是一个权限管理的后台页面,咱们须要这样的一个后台界面来配置和管理权限和资源。

  • PDP全称是Policy Decision Point,它提供了一些决策策略,经过这些策略将受权请求发送到相应的位置,并根据请求的权限对策略进行相应的决策。

  • PEP全称是Policy Enforcement Point,在不一样的资源服务器中执行相应的策略。

  • PIP全称是Policy Information Point,在判断和决策策略的时候,能够从中获取相应的属性信息。

上图中,Storage就是数据的存储和分类,这里咱们主要存储resouce,scope,permission和policy这4种对象。

resource表明的是要访问的对象,能够是一个或者多个对象的集合。好比说:web程序中的页面等等。资源是受保护的对象,须要为资源配置一些权限。

每一个资源都有一个惟一的标识符,能够表明一个资源或一组资源。 例如,你能够管理一个银行账户资源,该资源表明并定义了全部银行账户的一组受权策略。 可是,你也可使用另外一个名为Alice's Banking Account的资源,该资源表明由单个客户拥有的单个资源,该资源能够具备本身的一组受权策略。

咱们看一个resource的例子:

上图中,咱们将不一样的URI定义为resource。并给不一样的resource起了惟一的名字。

Scope是对资源的一系列操做,好比你能够对资源进行读,写或者编辑,删除操做,这些均可以被称之为scope。固然,你也能够指定resource中的某个属性做为scope。

而后就是Permission,权限将受保护的对象与是否授予访问权限的策略相关联。

好比咱们有下面一个权限:

X CAN DO Y ON RESOURCE Z

x表示的是一个或者多个用户,角色或者groups,或者是他们的组合。

Y表示的是对资源的一种操做。

Z就是资源了,好比/index页面。

咱们能够建立基于resource的permission:

也能够建立基于scope的permission:

Policy定义了要授予对象访问权限必须知足的条件。Policy并无指明要保护的对象,只是指定了访问给定对象必须知足的条件。

好比上面的Policy,指定了什么样的角色,针对什么样的client,制定出来的什么样的逻辑。

有了策略就须要一个Policy Provider,Policy Provider主要为咱们提供特定策略类型的实现。

为了作好策略评估的工做,咱们还须要一个策略评估引擎,经过这个engine来执行策略的评估工做。

除此以外,做为一个认证服务器,咱们还须要对外提供认证服务,那么最好的办法就是提供OAuth2或者OpenID Connect的token服务。

另外咱们还须要一个Protection API,用于resource server和权限管理服务进行交互。

本文已收录于 http://www.flydean.com/authorization-service/

最通俗的解读,最深入的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注个人公众号:「程序那些事」,懂技术,更懂你!

相关文章
相关标签/搜索