单点登陆与权限管理本质:权限管理介绍

前面几篇文章介绍了单点登陆的本质,包括cookie、session、重定向的基本概念,单点登陆的基本交互流程,cookie的重要性和安全问题。单点登陆可以确保:必须经过身份验证后,才能访问网站,且访问多个系统时,只须要登陆一次。html

该系列的完整写做计划,可见:系列概述前端

系列第一部分索引:redis

  1. session和cookie介绍
  2. HTTP重定向
  3. 单点登陆介绍
  4. cookie安全问题
  5. 权限管理介绍

通常系统都会有多个角色,不一样角色可访问的系统功能不一样,经过给用户分配不一样角色,决定用户可访问的系统功能。apache

继续介绍「单点登陆与权限管理」系列的第一部分:单点登陆与权限管理本质,本篇说说权限管理,主要从如下几个方面介绍:后端

  • 权限管理的通常模型
  • 权限验证范围
  • Shiro基本架构和扩展点
  • 系列第一部分总结

权限管理的通常模型

权限验证的过程比较简单,描述以下:缓存

  1. 用户登陆成功后,会将本身的我的信息和权限信息,保存到session中,能够存储在内存、redis中;
  2. 用户访问其余页面时,会根据访问路径,与用户权限数据进行匹配,验证是否有权限访问;
  3. 若是有权限,显示访问页面,若是无权限,提示用户无权访问;

权限验证基本流程

如何管理和分配用户权限呢,通常会抽象出以下实体概念:安全

  1. 用户:访问系统的主体;
  2. 角色:分配权限的最小单元,经过角色给用户分配权限;
  3. 权限菜单:权限的最小单元,一个角色配置多个权限菜单;

权限管理实体

另外,为了方便权限管理,会单独抽取一个服务「用户中心」,统一管理用户、角色和各个系统的权限菜单。权限菜单由各个子系统同步到「用户中心」或者提供批量导入的功能,权限菜单标识的规则要提早约定好,一致的菜单标识有助于权限拦截的判断。cookie

简单截取几个咱们项目中的页面,加深下理解:session

  1. 添加用户时,须要选择角色 架构

  2. 添加角色时,须要选择权限菜单

  3. 权限菜单由各个子系统同步过来

权限验证范围

用户拥有了访问和操做某些数据的权限,但不表明能够访问全部的数据,可能只能访问和操做本身的数据,可能只能访问和操做组内的数据,这是更细粒度的权限控制。

权限验证的位置可能在前端、可能在后端。前端根据当前用户的权限,显示不一样的菜单项、操做按钮,后端根据当前用户的权限,验证操做的合法性,返回可访问的数据集合,权限验证位置也要考虑全面。

控制粒度

好比有这样一个场景:有一个查询订单接口供外部调用,可根据订单编号返回订单详情。

若是订单编号有规则可寻,且后端不对订单所属人进行判断,就能够查看其余人订单的信息,因此,须要更细粒度的判断,验证订单的所属人。

另外能够经过角色、菜单权限2个粒度进行权限验证:

<shiro:hasPermission name="permission1">
    <h2>拥有permission1权限能够看到这里</h2>
</shiro:hasPermission>
<shiro:hasRole name="role">
    <h2>拥有role角色能够看到这里</h2>
</shiro:hasRole>
复制代码
验证位置

为了让用户体验足够好,用户没法操做的菜单项和操做按钮不须要再显示了,须要在前端进行验证,好比添加用户的操做:

<shiro:hasPermission name="user:add">
    <a href='user/add'>添加用户</a>
</shiro:hasPermission>
复制代码

只有前端验证也不行,能够经过模拟HTTP请求绕过前端访问,后端也要进行验证,shiro提供了拦截器进行统一处理。

Shiro基本架构和扩展

Shiro是apache下的开源软件,一个的安全框架,对用户的身份和权限进行管理和验证,看看官网对它的概述:

Apache Shiro™ is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management

本篇不会介绍Shiro的细节,只是经过介绍Shiro的基本组件,对应到权限管理的通常模型。

Shiro的基本架构以下:

  1. Subject:当前与用户交互的实体,包括用户、第三方服务、corn任务等,使用者只需经过该对象提供的一系列方法,统一与后端的安全管理模块交互, 对应模型中的「用户」;
  2. Authenticator:负责验证用户身份,用户尝试登录时,会调用它的方法进行认证,它会根据配置,调用一个或多个Realm进行用户名和密码校验,对应模型中的「用户登录操做」;
  3. Authorizer:负责验证用户访问权限,用户访问一个页面时,能够根据它提供的方法验证用户的权限,它也会调用一个或多个Realm获取用户的权限数据,对应模型中的「是否有权限访问」;
  4. SessionManager:提供一种健壮的方式管理用户会话,这是Shiro的一个独特特性,若是是一个Web/Servlet应用,默认会使用已有的会话管理,若是不是Web应用,Shiro会使用内置的会话管理器。它会调用SessionDAO进行会话持久化,对应模型中的「Session管理」;
  5. CacheManager:Shiro在Authenticator、Authorizer、SessionManager模块,会访问后端的存储系统,使用缓存管理能够提升数据访问的性能,能够很方便的与第三方缓存框架集成,好比Ehcache,Redis等;
  6. Realms:是程序和用户数据、权限数据的桥梁,以插件的方式提供扩展,能够配置一个或多个Realm为Authenticator和Authorizer模块提供数据支持;
  7. Cryptography:提供数据加解密的支持,它封装了相关接口,更易理解和使用;

Shiro基本架构

经过上面的介绍能够看出,Shiro的基本组件与总结的「通常模型」是对应的,它帮助咱们实现了整个用户验证、权限验证、会话管理的流程,同时提供缓存管理、加解密封装提升了性能和安全性,经过Realm插件的方式支持扩展,自定义实现类获取用户、权限数据。

以用户身份认证为例,说明几个组件的交互过程:

基本交互过程

系列第一部分总结

到此,系列第一部分「单点登陆与权限管理本质」就介绍完了,经过5篇文章,把本身想说的本质说完了,基础概念确定会有遗漏,后续部分学习、总结过程当中,会不断补充。

还原技术的本质,把复杂的技术、框架抽象来看,造成一个相对简单、容易理解的视图,可以更好的理解、扩展、应用它。

对于单点登陆,经过cookie、http重定向,可自动进行跳转和身份验证,达到登陆一次,可访问多个子系统的效果。

对于权限管理,了解其通常的模型和验证流程,加上成熟的实现框架,能够快速、全面、稳定地实现它,并在此基础上进行扩展。

另外,cookie、用户的帐号权限信息很重要,要不断积累安全方面的知识,提升其安全性。

接下来的第二部分主要是实践,会仿照咱们的系统作一个DEMO,利用CAS、Shiro框架实现单点登陆和权限管理。另外,会抽象出一个「用户中心」,管理用户、角色、权限菜单,各个子系统经过同步方式同步本身的权限菜单。

系列索引:

  1. session和cookie介绍
  2. HTTP重定向
  3. 单点登陆介绍
  4. cookie安全问题
  5. 权限管理介绍

情情说
相关文章
相关标签/搜索