和 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. GMM算法的matlab程序

    GMM算法的matlab程序 在“GMM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...

  2. JMeter测试工具的使用

    Jmeter下载地址: http://jmeter.apache.org/download_jmeter.cgi 解压Jmeter压缩包,双击jmeter.bat 右击测试计划 右击线程组 右击HTT ...

  3. w3m 使用总结

    安装 sudo apt install w3m终端 w3m www.baidu.com 即可打开w3m是个开放源代码的命令行下面的网页浏览器.一般的linux系统都会自带这个工具,可以通过它在命令行下 ...

  4. [LeetCode] 15. 三数之和

    题目链接:https://leetcode-cn.com/problems/3sum/ 题目描述: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a ...

  5. 压力测试Apache

    在做类似商城秒杀系统的同事都知道要在支持高并发,高可用的环境下进行多次的压力测试来防止自己的项目结构被高额的点击量击穿,导致商品超卖等损失 介绍一款简单的软件 xampp xam里带了Apache服务 ...

  6. UE、UI、UCD、UED?职责划分?

    UE.UI.UCD.UED?你知道你是干啥的吗 名词 UE (User Experience) : 用户体验 UI (User Interface) : 用户界面 UCD (User-Centered ...

  7. HashMap 与 Hashtable 的区别

    Hashtable t 小写 二者用法一致   都实现Map接口 1.HashMap 的键值可以为null,而Hashtable不允许("null" 不是 null 前者是字符串 ...

  8. 初次使用Mybatis

    目录 mybatis简介 导入jar包 创建数据库以及数据库表 创建实体类 创建mapper.xml文件 配置mybatis 测试mybatis 三种查询方式 selectOne selectList ...

  9. Flask WTForms的使用和源码分析 —— (7)

    Flask-WTF是简化了WTForms操作的一个第三方库.WTForms表单的两个主要功能是验证用户提交数据的合法性以及渲染模板.还有其它一些功能:CSRF保护, 文件上传等.安装方法: pip3 ...

  10. MySQL 8.0 - Client does not support authentication protocol requested by server; consider upgrading MySQL client

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';