和 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. Ambari与Kerberos 集成

    Kerberos 介绍 Kerberos 是一个网络认证的框架协议,其设计的初衷便是通过密钥系统为 Client 和 Server 应用程序之间提供强大的认证服务.在使用 Kerberos 认证的集群 ...

  3. CSS伪元素:before/CSS伪元素:before/:after content 显示Font Awesome字体图标:after content 显示Font Awesome字体图标

    HTML <a href="javascript:volid(0);"><i class="icon-table"></i> ...

  4. 做自己的docker镜像(基于ubuntu:16.04)

    基于ubuntu:16.04 apt-get update -y apt-get install sudo -y 换源 sudo apt-get install vim sudo vim /etc/a ...

  5. (十)Modifying Your Data

    Elasticsearch provides data manipulation and search capabilities in near real time. By default, you ...

  6. lombook安装以及在eclipse和idea上配置

    一.安装 a.官网上的安装方法 1.点击Download! 2.点击确认下载 3.下载完成,双击打开,点击“open”即可 4.之后会自动找到你的IDE如Eclipse,点击“install/upda ...

  7. Golang 入门 : 数组

    数组是指一系列同一类型数据的集合.数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型,比如 int.string 等,也可以是用户自定义的类型.一个数组包含的元素个数被 ...

  8. C语言之控制语言:分支和跳转

    if语句 #include<stdio.h> int main(void) { const int FREEZING = 0; float temperature; int cold_da ...

  9. 第五章· Redis主从复制介绍

    一.Redis主从复制 二.Redis主从复制工作机制 一.Redis主从复制 Redis复制功能简单介绍 1)使用异步复制.2)一个主服务器可以有多个从服务器.3)从服务器也可以有自己的从服务器.4 ...

  10. 图论专题1考试Problem1

    Problem 1. bricksInput file: bricks.inOutput file: bricks.outTime limit: 1 secondjyb 在BUAA 天天被大神虐,所以 ...