引言
Apache Shiro 是一个功能强大且易于使用的 Java 安全框架,它执行身份验证、授权、加密和会话管理,可用于保护任何应用程序——从命令行应用程序、移动应用程序到最大的 web 和企业应用程序。
Shiro 提供了应用程序安全 API 来执行以下方面:
- Authentication(认证):验证用户身份,即用户登录。
- Authorization(授权):访问控制
- Cryptography(密码学):保护或隐藏私密数据
- Session Management(会话管理):每个用户的时间敏感状态
本文作为 Shiro 指南的第一篇,重点介绍 Shiro 的整体架构与认证功能。在本文的最后一章,我将编写一个案例串联本文讲述的知识点。
Shiro 整体架构
架构图
Shiro 的核心架构概念展示于下图,我将在随后介绍每个组件:
- Subject:实体在安全领域的抽象,这个实体可以是用户、服务、定时任务等与软件存在交互的事物。
- SecurityManager:在Shiro的整体架构中,
SecurityManager
是核心组件,它管理着所有与安全相关的操作。SecurityManager
类似于Spring框架中的ApplicationContext
,是 Shiro 功能的中心,协调着认证、授权、会话、缓存等不同组件。 - Authenticator:当用户尝试登录时,该逻辑由
Authenticator
负责执行用户身份验证并对尝试结果进行响应。Authenticator
与一个或多个存储相关用户/帐户信息的Realm协调,使用Realms
对象获得的账户数据用于验证用户的身份。 - Authorizer:负责应用程序中用户访问控制的组件,决定用户是否被允许执行某类操作。Authorizer 和 Authenticator 一样,需要访问后端数据源得到用户的角色与权限信息。
- SessionManager:管理用户会话的组件,负责会话的创建、存储、生命周期、安全控制。SessionManager提供了一种机制来跨多个请求和交互维持用户状态,这对于构建需要身份验证和授权的复杂系统是至关重要的。
- CacheManager:创建和管理
Cache
实例生命周期的组件。Shiro 在认证、授权与会话管理过程中,会访问多个后端数据源,缓存这些数据将提升系统性能。 - Cryptography:Shiro 的 crypto 宝包含易于理解和使用的加密密码、哈希(又名摘要)和不同编解码器实现的表示。例如:
Sha256Hash
负责对原始密码执行散列操作,然后与数据库中存储的密码匹配。 - Realm:Shiro 与应用安全数据之间的桥梁。用户登录认证和授权时,Shiro 需要访问账户信息,这一过程是通过查询为应用程序配置的一个或多个
Realm
实例实现。
术语解释
-
Subject:它代表应用程序用户的一个 安全特定视图(Security specific user view)。
安全特定视图:从安全控制和身份认证的角度对用户或实体的抽象表示。一个 Subject 实例代表一个与应用程序交互的实体,包括了这个用户的身份信息、角色、权限等。
在 Shiro 中,Subject 不局限于人类用户,可以是任何与应用程序交互的实体,包括: