登录和鉴权应该是一个完整的系统中几乎必不可少的部分,虽然现在已经有越来越多的框架帮我们简化了这部分工作量,大公司更是有自己专门的登录和权限控制系统,比如阿里的BUC和ACL,开发者仅需要通过简单的步骤便可接入功能完备的登录和权限控制系统,这部分通用能力下沉成为中间件,但没有开源,对小公司而言,登录和鉴权还是得依赖开源的框架,所以在此盘点一下当下最常用的几款登录和鉴权框架:spring-security,apache-shiro,outh2.0.

本专题共分为上下两篇,上篇讲理论,下篇实战.


花絮:什么是RBAC?

开篇前有必要先说一下RBAC,因为目前99%的登录和权限控制框架都是基于RBAC的,RBAC是基于角色的访问控制(Role-Based Access Control)在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便。

1.Spring-security

SpringSecurity在前几年似乎并没有今天用的人这么多,因为框架比较重,而且配置繁琐,直到springboot出现,局势开始扭转,现在使用Spring全家桶才是主流.SpringSecurity是通过一系列filter过滤器来实现登录和权限的控制,这么说可能比较笼统.引用一张网图(出处见水印)来描述整个SpringSecurity的登录和鉴权过程:

没看懂?没关系,我简化一下上面的步骤,分为两个过程,登录和鉴权:

登录:用户输入账号和密码,发送表单至服务器,服务器通过对用户输入的密码按照创建时相同的加密方式加密,然后与数据库中的账号密码比对,如果一致就通过登录,否则提示用户,这步比较简单.

重点来看鉴权:

由于SpringSecurity和Shiro都是基于RBAC的,所以原理都如这两张图所示,先获取当前用户的角色,然后根据角色获取权限列表,然后逐个判断是否包含所访问内容的权限.

这样看来是不是非常简单?没错,这正是RBAC的强大之处.

聊完了原理再来看看SpringSecurity的几个核心类:

Authentication

Authentication是一个接口,用来表示用户认证信息的,在用户登录后会将用户权限等信息封装进去,然后 保存在SecurityContextHolder 所持有的 SecurityContext 上下文中,供后续调用.

SecurityContextHolder

其实也没啥好说的,但它比较重要,还是啰嗦一下,它就是一个线程安全的Holder,里面用ThreadLocal hold了SecurityContext,提供了静态方法供调用者获取SecurityContext.

AuthenticationManager 和 AuthenticationProvider

AuthenticationManager 是一个用来处理认证请求的接口,如果认证成功后会返回一个包含用户权限等详细信息的Authentication对象,AuthenticationProvider其实就是AuthenticationManager的一个默认实现类,认证成功后的Authentication 对象将会保存在当前的 SecurityContext 中.

Authentication

UserDetailsService中定义了一些可以获取用户名、密码、权限等与认证相关的信息的方法,Authentication对象里的内容其实来源于UserDetails.当然最终还是来源于数据库.

关于SprigSecurity的理论部分就啰嗦这么多,下面看看shiro.


2.Apache-Shiro

Shiro因为其轻量,使用简单,也受到众多开发者青睐,麻雀虽小,五脏俱全.

Shiro的工作过程如图所示:

Subject:主体,可以狭义的理解为当前要登录的对象.

SecurityManager:安全管理器,即所有与安全有关的操作都会与 SecurityManager 交互,管理所有的主体.

Realm:域,泛指从数据库中获取到的如用户、角色、权限等关联信息.

没啥好解释的,shiro本身就比较简单清晰,结合RBAC理论就更好理解了.

完整的工作流程如下图:

①获取主体Suject->②委托给Security Manager去处理->③实际执行者为Autherticator->④选择指定的认证策略->⑤通过Realm(一般是JDBC Realm)去底层数据库拉取用户及角色和权限信息


3.Oauth2.0

Oauth应该是继单点登录以后最大的一个实用功能了,可以极大的提高用户体验.

Oauth是一种协议,开源的协议,举个实际的例子,各位都应该不陌生,我想登录慕课网,但我并不想注册账号,这时候就可以通过

点击这里,比如我点了QQ,就可以通过QQ账号授权给慕课网,避免我再注册个慕课网的账号

授权以后就可以像注册用户一样体验慕课网的全部功能,这种方式真的体验很好,所以Oauth在稍微大一点的系统都会有集成.

关于Oauth的原理我直接引用阮一峰老师的原话:简单说,OAuth 就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用.


单点登录:说简单粗暴一点就是在多个应用系统中只需要登录一次,就可以访问所有彼此信任的系统. 比如我登录了支付宝可以不用再输入账号密码也可以访问淘宝,天猫.


理论部分就啰嗦这么多,有这些基础之后,结合代码就比较好理解了,文中若有不正之处欢迎各路神仙留言斧正.

【登录及鉴权】-盘点那些主流的开源登录及权限认证框架 (上)相关推荐

  1. SpringSecurity动态加载用户角色权限实现登录及鉴权

    本文来说下SpringSecurity如何动态加载用户角色权限实现登录及鉴权 文章目录 概述 动态数据登录验证的基础知识 UserDetails与UserDetailsService接口 实现User ...

  2. Django基于JWT实现微信小程序的登录和鉴权

    什么是JWT? JWT,全称Json Web Token,用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信任,因为它是数字签名的. 与Session的区别 一.Session是在服务 ...

  3. 从零搭建若依(Ruoyi-Vue)管理系统(13)--登录和鉴权的实现

    文章目录 1. 新建相关数据表 3. 登录和鉴权处理逻辑 3.1 状态码 3.2 新增登录用户信息类 3.3 UserDetailsServiceImpl 3.3 token认证过滤器 JwtAuth ...

  4. 【强势来袭】Node.js(nodejs)实现“一口多用”(含用户创建、登录、鉴权token) 一个文件解决所有常态化需求

    注意,前情提示: 本代码基于<Node.js(nodejs)对本地JSON文件进行增.删.改.查操作(轻车熟路)> 传送门Node.js(nodejs)对本地JSON文件进行增.删.改.查 ...

  5. emq auth mysql_EMQ X 认证鉴权(一)——基于 MySQL 的 MQTT 连接认证

    前言 安全保护几乎对于所有的项目都是一个挑战,对于物联网项目更是如,自普及应用以来物联网业内已经发生过多起安全事故. 作为物联网通信协议事实标准,MQTT 保持着较高的安全性,提供了多层次的安全设计: ...

  6. emqx接通mysql_EMQ X 认证鉴权(一)——基于 MySQL 的 MQTT 连接认证

    前言 安全保护几乎对于所有的项目都是一个挑战,对于物联网项目更是如,自普及应用以来物联网业内已经发生过多起安全事故. 作为物联网通信协议事实标准,MQTT 保持着较高的安全性,提供了多层次的安全设计: ...

  7. OAuth模块管理客户端的用户登录鉴权功能,允许应用访问第三方平台的资源

    OAuth接口支持开发者调用当前环境中安装的三方客户端App(如微信.微博等)的授权登录页面进行鉴权操作. 若终端安装了对应的客户端App,则调用客户端的授权登录页面,否则调用WAP页面进行授权登录. ...

  8. 玩一玩登录鉴权与生命周期

    登录与鉴权 玩一玩平台登录是依赖于QQ服务号,类似微信公众号的授权登录,只是玩一玩平台在后台自动获取用户对应的openId. 下面是详细的流程 游戏加载流程 游戏加载主要分为两个阶段,准备阶段 是由手 ...

  9. 详解比springSecurity和shiro更简单优雅的轻量级Sa-Token框架,比如登录认证,权限认证,单点登录,OAuth2.0,分布式Session会话,微服务网关鉴权

    文章目录 1. 技术选型 2. Sa-Token概述 2.1 简单介绍 2.2 登录认证 2.3 权限认证 3. 功能一览 4. Sa-Token使用 4.1 引入Sa-Token依赖 4.2 Sa- ...

最新文章

  1. edge chrome 浏览器 底色调黑 反色
  2. 量子纠缠背后的故事(廿五):深藏幕后的神秘力量
  3. 一个很适合用来套用后台的框架
  4. Python 基础篇-python3安装pyHook和pywin32库
  5. 红帽企业虚拟化平台RHEV中WINDOWS 虚拟机如何安装 GUEST代理和驱动
  6. 用aspnet_compiler发布网站 (转载:My way of my life )
  7. Atitit web 视频播放器classid clsid 大总结quicktime vlc 1 Classid的用处
  8. Max Script 入门教程
  9. win7 添加 邮件服务器,win7系统如何配置outlook邮件客户端教程
  10. Network: unavailable
  11. 简易计算机系统综合设计--函数发生器
  12. vs工程生成自定义图标的exe
  13. 使用java自带的方式调用打印机打印图片
  14. 基于python的博客设计与开发_基于python的博客设计与开发毕业设计
  15. element遮罩_如何实现全屏遮罩(附Vue.extend和el-message源码学习)
  16. ROS2网络课程资料分享2019.10.26
  17. VTS 固态雷达 OCEANGARD
  18. DRAM知识整理系列(一):SDRAM的简介与SDRAM的管脚与尺寸介绍
  19. ajax实现留言板功能 -
  20. 2016计算机网络复习

热门文章

  1. 计算机考试 北京考场一日游
  2. 微博鸿蒙系统,如何看待华为P50未出,却又迎来华... - @柏铭007 的微博精选 - 微博国际站...
  3. 互联网文艺复兴者——互联网之父Vinton G. Cerf
  4. 个人python学习(10)
  5. 从实验到投稿录用的一次经历(历时小半年)
  6. 蒂森服务器显示0009,蒂森电梯故障代码显示内容及处理方法
  7. 华为OJ 初级:人民币转换
  8. 据说程序员节 随手记录下matlab的tan和atan(反正切 arctan函数)
  9. DHU Deep Learning Practice_章节测验【1】
  10. PID控制算法与参数整定,用这几招轻松搞定!