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是互斥的
currentUser.logout(); //清除验证信息,使 session 失效
第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 有效提供一次独立的验证尝试
AuthenticationStrategyclass | Description |
---|---|
AtLeastOneSuccessfulStrategy | 如果有一个或多个Realm验证成功,所有的尝试都被认为是成功的,如果没有一个验证成功,则该次尝试失败 |
FirstSuccessfulStrategy | 只有从第一个成功验证的Realm返回的信息会被使用,以后的Realm将被忽略,如果没有一个验证成功,则该次尝试失败 |
AllSuccessfulStrategy | 所有配置的Realm在全部尝试中都成功验证才被认为是成功,如果有一个验证不成功,则该次尝试失败。 |
原文:https://www.cnblogs.com/keepInsist/p/11672732.html