Authentication :身份验证——通过提交用户的身份和凭证给 Shiro,以判断它们是否和应用程序预期的相匹配。
基本概念:
- Principals(身份):Subject 的 identifying attributes(标识属性)。比如我们登录提交的用户名。
- Credentials(凭证):用来作为一种起支持作用的证据,此证据包含 ××× 明。比如我们登录提供的密码
认证的基本步骤:
- 收集 Subjects 提交的 Principals(身份) 和 Credentials(凭证);
- 提交 Principals(身份) 和 Credentials(凭证) 进行身份验证;
- 如果提交成功,则允许访问,否则重新进行身份验证或者阻止访问。
- AuthenticationToken:Shiro 中代表提交的 Principals(身份) 和 Credentials (凭证) 的身份验证系统的最基本接口。
- UsernamePasswordToken :AuthenticationToken 的接口的实现类,支持最常见的用户名 / 密码的身份验证
提交用户名 / 密码进行认证:
处理认证成功和失败
- 认证成功:没有返回,也没有异常,通过。
- 认证失败,拋出异常,可以在程序中捕获并处理
认证顺序:
认证过程:
说明:
Step 1: 应用程序代码调用 Subject.login 方法,传递创建好的包含终端用户的 Principals(身份) 和 Credentials(凭证) 的 AuthenticationToken 实例
Step 2: Subject 实例,通常为 DelegatingSubject(或子类)委托应用程序的 SecurityManager 通过调用 securityManager.login(token) 开始真正的验证。
Step 3: SubjectManager 接收 token,调用内部的 Authenticator 实例调用 authenticator.authenticate(token)。 Authenticator 通常是一个 ModularRealmAuthenticator 实例,支持在身份验证中协调一个或多个 Realm 实例。
Step 4: 如果应用程序中配置了一个以上的 Realm,ModularRealmAuthenticator 实例将利用配置好的 AuthenticationStrategy 来启动 Multi-Realm 认证尝试。在 Realms 被身份验证调用之前,期间和以后,AuthenticationStrategy 被调用使其能够对每个 Realm 的结果作出反应。
Step 5: 每个配置的 Realm 用来帮助看它是否支持提交的 AuthenticationToken。如果支持,那么支持 Realm 的 getAuthenticationInfo 方法将会伴随着提交的 token 被调用。getAuthenticationInfo 方法有效地代表一个特定 Realm 的单一的身份验证尝试。