-
authentication认证
认证(Authentication):身份验证的过程--也就是证明一个用户的真实身份。为了证明用户身份,需要提供系统理解和相信的身份信息和证据。
需要通过向 Shiro 提供用户的身份(principals)和证明(credentials )来判定是否和系统所要求的匹配。
Principals(身份) 是Subject的“标识属性”,可以是任何与Subject相关的标识
Credentials(证明) 通常是只有 Subject 知道的机密内容,用来证明他们真正拥有所需的身份,一些简单的证书例子如密码、指纹、眼底扫描和X.509证书等 -
Authenticating Subjects
Subject 验证的过程可以有效地划分分以下三个步骤:
1.收集 Subject 提交的身份和证明;
//最常用的情况是 username/password 对: UsernamePasswordToken token = new UsernamePasswordToken(username, password); //”Remember Me” 功能是内建的 token.setRememberMe(true);
2.向 Authentication 提交身份和证明;Subject currentUser = SecurityUtils.getSubject(); currentUser.login(token);
3.如果提交的内容正确,允许访问,否则重新尝试验证或阻止访问
try { currentUser.login(token); } catch ( UnknownAccountException uae ) { ... } catch ( IncorrectCredentialsException ice ) { ... } catch ( LockedAccountException lae ) { ... } catch ( ExcessiveAttemptsException eae ) { ... } ... 捕获你自己的异常 ... } catch ( AuthenticationException ae ) { //未预计的错误? }
Remembered vs. Authenticated
记住的(Remembered):一个被记住的 Subject 不会是匿名的,拥有一个已知的身份(也就是说subject.getPrincipals())返回非空)。它的身份被先前的认证过程所记住,并存于先前session中,一个被认为记住的对象在执行subject.isRemembered())返回true。
已验证(Authenticated):一个被验证的 Subject 是成功验证后(如登录成功)并存于当前 session 中,一个被认为验证过的对象调用subject.isAuthenticated()) 将返回true
remembered和authentication是互斥的Logging Out
currentUser.logout(); //清除验证信息,使 session 失效
Authentication Sequence 认证顺序
第1步:应用程序代码调用该
Subject.login
方法,并传入AuthenticationToken
表示最终用户的主体和凭据的构造实例。
第2步:Subject 实例,通常是一个 DelegatingSubject(或其子类)通过调用 securityManager.login(token )将这个令牌转交给程序的 SecurityManager。
第3步:SecurityManager,基本的“安全伞”组件,得到令牌并通过调用 authenticator.authenticate(token))简单地将其转交它内部的 Authenticator 实例,大部分情况下是一个 ModularRealmAuthenticator 实例,用来支持在验证过程中协调一个或多个Realm实例。
第4步:如程序配置了多个 Realm,ModularRealmAuthenticator实例将使用其配置的 AuthenticationStrategy 开始一个 多 Realm 身份验证的尝试。在 Realm 被验证调用的整个过程中,AuthenticationStrategy(安全策略)被调用用来回应每个Realm结果(如果仅有一个 Realm 被配置,它直接被调用--在单 Realm 程序中不需要AuthenticationStrategy
第5步:每一个配置的 Realm 都被检验看其是否支持提交的AuthenticationToken,如果支持,则该 Realm 的 getAuthenticationInfo 方法随着提交的牌被调用,getAuthenticationInfo 方法为特定的 Realm 有效提供一次独立的验证尝试
AuthenticationStrategy认证策略
AuthenticationStrategyclass | Description |
---|---|
AtLeastOneSuccessfulStrategy | 如果有一个或多个Realm验证成功,所有的尝试都被认为是成功的,如果没有一个验证成功,则该次尝试失败 |
FirstSuccessfulStrategy | 只有从第一个成功验证的Realm返回的信息会被使用,以后的Realm将被忽略,如果没有一个验证成功,则该次尝试失败 |
AllSuccessfulStrategy | 所有配置的Realm在全部尝试中都成功验证才被认为是成功,如果有一个验证不成功,则该次尝试失败。 |