Shiro学习笔记(1)——综述

来源:互联网 发布:永久爱奇艺会员软件 编辑:程序博客网 时间:2024/05/24 07:34

刚刚接触Shiro我是懵逼的,我从来没见过这个东西,所以程序员是非常有趣的职业,虽然我还不是,这意味着工作的过程中会碰到各种奇怪的闻所未闻的东西,因此保持好奇和学习的能力十分重要,没错,我要学习Shiro了。


Shiro简介

Shiro是一款强力易用的Java安全框架,可以用于认证、授权、加密以及会话管理等等用途,无论是Java SE还是Java EE环境,它都能够发挥作用。Shiro具有以下特征:
这里写图片描述
上图来自于Apache Shiro官网。
Shiro的开发团队将它的”Primary Concerns”称为应用安全的基础,也就是:

  • Authentication:也可以称作login,用于验证用户是否具有相关权限;
  • Authorization:用于验证用户是否具有某些操作权限、以及决定用户的权限;
  • Session Management:管理用户会话,用户登录到退出前都是在一次会话中,会话可以存在于非Web应用中;
  • Cryptography:利用加密算法保证用户数据的安全性。

Shiro的扩展特性:

  • Web Support:Shiro的Web Support APIs可以轻松地集成到Web应用上;
  • Caching:缓存。缓存可以有效地保证安全操作的效率;
  • Concurrency:并发性。Shiro支持多线程应用的并发验证,例如在一个线程中开启另一个线程,能够自动把权限传播过去;
  • Testing:测试支持;
  • Run as:该项特性允许一个用户作为另一个用户进行操作;
  • Remember me:登录过一次之后接下来之后不用再登录。

Shiro不会维护用户、维护权限,我们需要自行设计、提供,然后通过相应的接口注入给Shiro。

Shiro架构

高层概览

在顶层概念层面上,Shiro有三个基础概念:SubjectSecurityManager以及Realm,下图展示了它们之间是如何进行交互
这里写图片描述
接下来我们依次了解这些概念:

  • Subject:主体,从上面的架构图中我们也可以看到,和应用代码发生直接交互的正是Subject,它是对外API的核心。与应用发生特定安全性交互的当前用户就是所谓的主体,它当然可以是一个用户,也可以是第三方服务、定时任务等等任何与程序发生交互的,主体实例都需要被SecurityManager约束,当和一个主体发生交互时,该交互会转化为特定主体和SecurityManager的交互,可以认为SecurityManager才操作是实际执行者;
  • SecurityManager:安全管理器,所有的安全相关的操作最终都需要和SecurityManager交互,并且它管理着所有的Subject,它是Shiro架构的心脏。关于SecurityManager,后面还会介绍,我们需要谨记的是,当与一个主体发生交互时,实际上SecurityManager在幕后承担了所有安全操作的工作。
  • Realm:域。它充当了Shiro和应用的安全数据之间的桥梁。我们可以将它视为安全操作的DAO层。

也就是说,一个Shiro应用,应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager;我们需要给Shiro的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断。

细致架构

这里写图片描述
上图描述了Shiro的核心架构理念。

  • Subject:主体,当前与程序交互的任何实体,包括第三方程序。
  • SecurityManager:所谓的心脏,所有的具体交互都由它控制,不仅管理所有Subject,也管理着所有认证、授权、会话和缓存。
  • Authenticator :认证器,负责执行和响应用户的登录认证操作。

    • Authentication Strategy:当存在一个或者多个Realm时,由认证策略来决定在哪些情形下认证是成功还是失败。
  • Authorizer:授权器,或者叫访问控制器,决定主体在应用中能够访问哪些功能,能够进行哪些操作。

  • SessionManager:该组件负责管理Session的生命周期及其创建,这在安全框架界是个另类的存在,它能够在任何环境内管理会话,即便根本没有EJB或者是Servlet容器。默认Shiro有一个自己的session来管理主体和应用之间的交互;
    • SessionDAO:用于执行CRUD操作;
  • CacheManager:缓存控制器,来管理如用户、角色、权限等的缓存的;因为这些数据基本上很少去改变,放到缓存中后可以提高访问的性能;
  • Cryptography:密码模块,Shiro提高了一些常见的加密组件用于如密码加密/解密。