一、Shiro简介
Apache Shiro是一个强大且易用的Java安全框架,提供了认证、授权、会话管理、加密等功能。它不仅适用于JavaSE环境,也适用于JavaEE环境。Shiro的核心功能点包括Authentication(认证)、Authorization(授权)、Session Manager(会话管理)和Cryptography(加密),这些被Shiro框架的开发团队称为应用安全的四大基石。
二、Shiro认证(Authentication)概述
Shiro的认证功能是指身份验证的过程,即证明一个用户实际上是不是他们所说的他们是谁。通过提交用户的身份和凭证给Shiro,Shiro会判断它们是否和应用程序预期的相匹配。
三、Shiro认证的关键对象及流程
-
Subject(用户):代表了当前操作用户,可以是任何与应用交互的“用户”,如人、网络爬虫、机器人等。获取当前用户Subject的代码为
SecurityUtils.getSubject()
。 -
SecurityManager(安全管理器):Shiro的核心,负责与其他组件进行交互,实现Subject委托的各种功能。所有与安全有关的操作都会与SecurityManager交互,且它管理着所有的Subject。
-
Realms(数据源):Shiro从Realm获取安全数据(如用户、角色、权限)。Realm充当着与安全管理间的桥梁,经过Realm找到数据源进行认证、授权等操作。可以把Realm看成DataSource,即安全数据源。
-
Authenticator(认证器):用于认证,从Realm数据源取得数据之后进行执行认证流程处理。这是一个扩展点,如果用户觉得Shiro默认的不好,可以自定义实现。
-
认证流程:
- 应用程序代码调用Subject.login方法,传递创建好的包含终端用户的Principals(身份)和Credentials(凭证)的AuthenticationToken实例。
- Subject实例(通常是DelegatingSubject或子类)委托应用程序的SecurityManager通过调用securityManager.login(token)开始真正的验证。
- SecurityManager接收token,并简单地委托给内部的Authenticator实例通过调用authenticator.authenticate(token)进行认证。这通常是一个ModularRealmAuthenticator实例,支持在身份验证中协调一个或多个Realm实例。
- 如果应用程序中配置了一个以上的Realm,ModularRealmAuthenticator实例将利用配置好的AuthenticationStrategy来启动Multi-Realm认证尝试。
- 每个配置的Realm用来帮助看它是否支持提交的AuthenticationToken。如果支持,那么支持Realm的getAuthenticationInfo方法将会伴随着提交的token被调用,以完成身份验证。
四、Shiro认证的特点与优势
- 简单的身份验证:Shiro提供了简单的身份验证机制,支持多种数据源。
- 细粒度的授权:除了认证,Shiro还支持对角色的简单授权以及细粒度的授权(如方法级别的授权)。
- 会话管理:Shiro内置了基于POJO的企业会话管理,适用于Web及非Web环境。
- 加密与缓存:Shiro提供了加密解密的工具包,并支持一级缓存以提升应用程序的性能。
- 独立运行:Shiro不跟任何框架绑定,可以独立运行。
五、注意事项
- 在Web应用程序中,记住身份往往是依靠Cookies。然而,Cookies只能在Response被committed之前被删除,所以强烈建议在调用subject.logout()后立即将终端用户重定向到一个新的视图或页面,以保证任何与安全相关的Cookies都能像预期的一样被删除。
- Remembered和Authenticated是互斥的。若其中一个为真,则另一个为假。
综上所述,Shiro认证是一个功能强大且易于使用的Java安全框架的组成部分。通过合理的配置和使用,可以有效地提升应用程序的安全性。