Authentication :身份验证——通过提交用户的身份和凭证给 Shiro,以判断它们是否和应用程序预期的相匹配。

基本概念:

  • Principals(身份):Subject 的 identifying attributes(标识属性)。比如我们登录提交的用户名。
  • Credentials(凭证):用来作为一种起支持作用的证据,此证据包含 ××× 明。比如我们登录提供的密码

认证的基本步骤:

  • 收集 Subjects 提交的 Principals(身份) 和 Credentials(凭证);
  • 提交 Principals(身份) 和 Credentials(凭证) 进行身份验证;
  • 如果提交成功,则允许访问,否则重新进行身份验证或者阻止访问。
  • AuthenticationToken:Shiro 中代表提交的 Principals(身份) 和 Credentials (凭证) 的身份验证系统的最基本接口。
  • UsernamePasswordToken :AuthenticationToken 的接口的实现类,支持最常见的用户名 / 密码的身份验证

提交用户名 / 密码进行认证:

Subject currentUser = SecurityUtils.getSubject();
currentUser.login(token);

处理认证成功和失败

  • 认证成功:没有返回,也没有异常,通过。
  • 认证失败,拋出异常,可以在程序中捕获并处理

认证顺序

认证过程:

说明:

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 的单一的身份验证尝试。