刚刚接触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有三个基础概念:Subject、SecurityManager以及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提高了一些常见的加密组件用于如密码加密/解密。