和 Spring Security 项目一样, Apache Shiro 也是一个被广泛使用安全框架, 它们都能完成认证、授权、会话管理等. 简单对比一下 Apache Shiro 和 Spring Security:

1. 适用范围: Spring Security 必须和 Spring MVC 一起使用, 而 Shiro 是一个通用的安全框架, 可以用在 Spring MVC 或 JavaEE/JavaSE 环境中.
2. 复杂程度: Spring Security 是一个非常复杂的架构, 虽然搭配 Spring Boot 后, 使用的难度小了些, 但是还是很复杂. Shiro  概念少, 使用也简单了很多.
3. 版本变动: Spring Security 变化很频繁, 网上教程多是基于 Spring Boot 1.x 的, 在 Spring Boot 2.x 下很多都不适用了. Shiro 从 2010 年发展到现在, 功能和代码已经相当成熟了, 几乎不会有大的变动.
4. 功能多少方面, 方面: Spring Security 内置支持 CSRF 保护, Shiro 没有开箱即用, 基于 Shiro 的项目 buji-pac4j 实现了 CSRF 保护.

==========================
Shiro 的几个概念
==========================
Subject: Subject 代表当前登录系统的主体对象, 比如 username 或 appId.
Realm: 负责提供认证和授权的信息源, 数据源可以来源 Jdbc 数据库或其他.
SecurityManager: Shiro 的核心, 我们需要将 Realm 注入到 SecurityManager, 然后 SecurityManager 为我们提供授权功能. SecurityManager 同时也是内部各个组件的组装器, 如果我们要实现自己的 Cache 或 Session 管理器, 也是通过 SecurityManager 注入.
SecurityManager的两个实现类:
1. DefaultSecurityManager: 用于 JavaSE 环境
2. DefaultWebSecurityManager: 用于 Web 环境的实现, 对应底层使用的是 ServletContainerSessionManager 类 Session 管理器.

--------------------------
内部架构:
--------------------------
Authenticator: 认证器, 内置一个实现类是 ModularRealmAuthenticator, ModularRealmAuthenticator 默认的认证策略是 AtLeastOneSuccessfulStrategy, 在这个策略下, 如果我们提供了多个 Realm, 只要一个 Realm 认证通过, 即表示最终认证通过. 可选的认证策略有: AllSuccessfulStrategy(全部认证通过), AtLeastOneSuccessfulStrategy(至少一个认证通过), FirstSuccessfulStrategy (首个认证通过).

Authorizer: 授权器, 或者访问控制器, 用来决定主体是否有权限对某个资源有操作权限.

Cache manager, 用来管理用户、角色、权限缓存, 通常这些配置信息不会频繁改变, 使用 cache 可以提高性能. Shiro 不提供 cache DAO 实现, 如果我们要使用 cache 功能, 需要自己实现.

Session Manager, Shiro 使用 session 来管理 subject 的生命周期, 包括: 创建/停止/过期 等等, shiro 内置了三个实现:
1. DefaultSessionManager, DefaultSecurityManager 使用的默认 Session Manager,用于 JavaSE 环境.
2. ServletContainerSessionManager, DefaultWebSecurityManager 使用的默认 Session Manager,用于 Web 环境,其直接使用 Servlet 容器的会话.
3. DefaultWebSessionManager, 用于 Web 环境的实现,可以替代 ServletContainerSessionManager, 自己维护或持久化会话.

--------------------------
认证和赋权相关几个术语:
--------------------------
AuthenticationInfo 接口: 认证通过的身份和凭证. 在 realm 类中, 需要实现一个 doGetAuthenticationInfo(AuthenticationToken) 方法, 在该方法中, 先验证用户密码是否 OK, 验证通过后需要返回 AuthenticationInfo 接口的实现, 通常使用的实现类是 SimpleAccount 或 SimpleAuthenticationInfo. SimpleAccount 和 SimpleAuthenticationInfo 中包含着 Principal[身份] 和 Credentials[凭证] 信息.

Principal[身份] 和 Credentials[凭证]  : Principal 基本等同于 Username(在shiro相关方法中, 有的 Principa 对象保存着字符串, 有的保存着 我们自定义的User 对象, 需要格外注意 ), Credentials 往往等同于 password, 需要说明的是, Shiro 支持使用多个 realm 作为认证数据源, 所以一个 subject 有可能会有多个 Principal 的. Principal 是通过验证后才被创建的对象, 可以通过 subject 对象获取 Principal.

AuthorizationInfo 接口: 包含用户所属的角色和具备的权限. 在 realm 类中, 需要实现一个 doGetAuthorizationInfo(PrincipalCollection principals) 方法.

AuthenticationToken: 是用来提交验证的 token 值, 经常使用的实现类是 UsernamePasswordToken.

====================================
RunAs 功能
====================================
RunAs 是一个免登录身份切换, 有两个主要的工作场景: 一是后台超级管理员切换到其他用户, 用户debug; 二是方便实现用户代理, 比如秘书代理老板的工作.
主要有4分方法:
1. subject.runAs(new SimplePrincipalCollection(newUsername, MyShiroRealm.class.getSimpleName()));
切换用户身份, 注意: runAs() 并不会对 newUsername 进行任何Authenticate/authorization方面的验证, 需要自行验证.
2. Subject.isRunAs(), 判断当前 subject 是否是在 RunAs 模式下.
3. Subject.getPreviousPrincipals(); 得到切换身份之前的身份,一个用户可以切换很多次身份,之前的身份使用栈数据结构来存储.
4. Subject.releaseRunAs() 切换回之前的身份.

==========================
使用 Shiro 的一般过程是:
==========================
1. 创建 SecurityManager 对象
    对于 Web 项目可以直接 new DefaultWebSecurityManager 子类, ini 文件的realm也可以使用 IniSecurityManagerFactory 工厂方法创建.
2. 在程序中注入 SecurityManager 对象,
    对于 Spring 项目, 需要定义一个 ShiroFilterFactoryBean bean, 然后通过该bean来注册 SecurityManager, shiroFilterFactoryBean.setSecurityManager(securityManager) .
    对于其他项目, 可以使用 SecurityUtils.setSecurityManager(securityManager) 注入.
3. 进行资源授权配置.
    对于 Spring 项目, 可以用 ShiroFilterFactoryBean bean来设置拦截器;
    也可以在 ini 文件的 url 节中定义资源授权配置.
4. 定义 Realm, 实现 doGetAuthenticationInfo(AuthenticationToken) 和 doGetAuthorizationInfo() 方法. doGetAuthenticationInfo( authcToken)
     对于 JDBC , 一般是 user/role/permission 三张表, 以及 user_role/role_permssion 两个关系表.
    也可以在 Ini 文件中定义, 基本用作demo.
5. 使用 SecurityUtils.getSubject() 获取 subject, 然后调用 subject.login(), 该方法将触发 realm 的 doGetAuthenticationInfo(AuthenticationToken authcToken) 方法, 进行身份验证
6. 在进行权限验证的时候, 会触发 realm 的 doGetAuthorizationInfo(PrincipalCollection principals) 函数, 由该函数进行角色和权限的验证.

Shiro 系列 - 基本知识的更多相关文章

  1. Apache Shiro系列之五,概述 —— 配置

    Shiro设计的初衷就是可以运行于任何环境:无论是简单的命令行应用程序还是复杂的企业集群应用.由于运行环境的多样性,所以有多种配置机制可用于配置,本节我们将介绍Shiro内核支持的这几种配置机制.   ...

  2. Apache Shiro系列四,概述 —— Shiro的架构

    Shiro的设计目标就是让应用程序的安全管理更简单.更直观.     软件系统一般是基于用户故事来做设计.也就是我们会基于一个客户如何与这个软件系统交互来设计用户界面和服务接口.比如,你可能会说:“如 ...

  3. Apache Shiro系列三,概述 —— 10分钟入门

     一.介绍 看完这个10分钟入门之后,你就知道如何在你的应用程序中引入和使用Shiro.以后你再在自己的应用程序中使用Shiro,也应该可以在10分钟内搞定. 二.概述 关于Shiro的废话就不多说了 ...

  4. window7使用svn(svn系列 客户端 知识二总结)

     ♣eclipse插件subclipse  ♣TortoiseSVN  ♣svn操作  ♣注意事项 使用svn可以在eclipse直接装subclipse或者在windows使用TortoiseSVN ...

  5. Apache Shiro系列一,概述 —— 初识

    一.什么是Shiro Apache Shiro是一个强大.灵活.开源的安全框架,它支持用户认证.权限控制.企业会话管理以及加密等. Apache Shiro的第一个也是最重要的一个目标就是易于使用和理 ...

  6. Shiro第一篇【Shiro的基础知识、回顾URL拦截】

    Shiro基础知识 在学习Shiro这个框架之前,首先我们要先了解Shiro需要的基础知识:权限管理 什么是权限管理? 只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安 ...

  7. Shiro入门这篇就够了【Shiro的基础知识、回顾URL拦截】

    前言 本文主要讲解的知识点有以下: 权限管理的基础知识 模型 粗粒度和细粒度的概念 回顾URL拦截的实现 Shiro的介绍与简单入门 一.Shiro基础知识 在学习Shiro这个框架之前,首先我们要先 ...

  8. Apache Shiro系列(1)

    Apache Shiro是啥呢,安全框架. 360百科是这么描述的:        Apache Shiro(日语"堡垒(Castle)"的意思)是一个强大易用的Java安全框架, ...

  9. Apache Shiro系列二,概述 —— 基本概念

    做任何事情,首先要双方就一些概念的理解达成一致,这样大家就有共同语言,后续的沟通效率会高一些. #,Authentication,认证,也就是验证用户的身份,就是确定你是不是你,比如通过用户名.密码的 ...

随机推荐

  1. 一、Windows Server 2016 AD服务器搭建

    简介: AD是Active Directory的简写,中文称活动目录.活动目录(Active Directory)主要提供以下功能: 1)服务器及客户端计算机管理 2)用户服务 3)资源管理 4)桌面 ...

  2. JavaScript作用域链的理解

    前言 作用域是JavaScript一个很重要的概念,想要学好JavaScript就需要理解javascript作用域和作用域链的工作原理.这篇文章对JavaScript作用域链和作用域链做一个简单的介 ...

  3. C#基础知识之类和结构体

    虽然项目中一直在使用类.结构体等类型,仔细琢磨,还真无法系统的说出个所以然.记录一下类.结构体.类和结构体区别 一.类 对于类,大家都特别熟悉.简单的介绍一下类的结构,然后记录一下Class需要注意的 ...

  4. TK2 USB修复

    https://www.jianshu.com/p/bb4587014349 开发板刷机过程全程联网 除了Jetson TX2之外,您还需要另一台带有Intel或AMD x86处理器的台式机或笔记本电 ...

  5. (四)esp8266 MDNS域名服务

    (实例一)ESP8266 TFT(ST7735)彩屏-web刷图 https://www.arduino.cn/thread-42247-1-1.html (实例二) 自己当AP时建立MDNS域名 h ...

  6. 理论篇-Java中一些零碎的知识点

    1. Java中length,length方法,size方法区别 length属性:用于获取数组长度. length方法:用于获取字符串长度. size方法:用于获取泛型集合有多少个元素. 2. is ...

  7. Shiro学习(一)——Shiro简介

    Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大 ...

  8. MJT's Blog

    This is MJT's blog. Here is a mirror web of his blog.

  9. Spring:AOP面向切面编程

    AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...

  10. 线性回归和Logistic回归

    目录 线性回归 用线性回归模型拟合非线性关系 梯度下降法 最小二乘法 线性回归用于分类(logistic regression,LR) 目标函数 如何求解\(\theta\) LR处理多分类问题 线性 ...