[
https://issues.apache.org/jira/browse/SHIRO-769?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Benjamin Marwell updated SHIRO-769:
-----------------------------------
Labels: stale (was: )
> Multiple realm exceptions cannot be catch
> -----------------------------------------
>
> Key: SHIRO-769
> URL: https://issues.apache.org/jira/browse/SHIRO-769
> Project: Shiro
> Issue Type: Bug
> Components: Realms
> Affects Versions: 1.5.3
> Environment: jdk8
> Reporter: XiuYu.GE
> Priority: Critical
> Labels: stale
>
> I have multiple realm, one of them
> {code:java}
> //代码占位符
> @Override
> protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken
> authenticationToken) throws AuthenticationException {
> IphoneCodeToken iphoneCodeToken = (IphoneCodeToken)authenticationToken;
> MemberService memberService = SpringUtils.getBean(MemberService.class);
> Member member = memberService.findByMember(new
> Member().setMobilePhone(iphoneCodeToken.getIphone()));
> RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
> Object ipheonCodeNumObj =
> redisUtil.get(String.format(MEM_VERIFY_CODE.getKey(),
> iphoneCodeToken.getIphone()));
> //是否存在验证码
> if(ipheonCodeNumObj == null){
> throw new IncorrectCredentialsException();
> }
> //是否过期
> VerifyCodeData verifyCodeData = (VerifyCodeData)ipheonCodeNumObj;
> if(verifyCodeData.getTimestamp() < System.currentTimeMillis()){
> throw new ExpiredCredentialsException();
> }
> //验证码错误
> if(!verifyCodeData.getCode().equals(iphoneCodeToken.getCode())){
> throw new IncorrectCredentialsException();
> }
> //说明账号不存在
> if(member == null){
> throw new UnknownAccountException();
> }
> //是否为禁用
> if(member.getEnable().equals(MemberConstant.MemberStatus.DISENABLE)){
> throw new DisabledAccountException();
> }
> //设置到
> CurrUser currUser = new CurrUser();
> BeanUtils.copyProperties(member,currUser);
> SessionUtils.setInfo(currUser);
> return new
> SimpleAuthenticationInfo(iphoneCodeToken.getIphone(),iphoneCodeToken.getCode(),this.getClass().getName());
> }
> {code}
> but can catch DisabledAccountException ,ExpiredCredentialsException and
> IncorrectCredentialsException
>
> {code:java}
> //代码占位符
> try {
> subject.login(new IphoneCodeToken(loginData.getIphone(),
> loginData.getCode()));
> } catch (DisabledAccountException ee) {
> //主要考虑已注册就被禁用
> return ResultBean.error("账号被禁用");
> } catch (ExpiredCredentialsException ee) {
> return ResultBean.error("验证码已过期");
> } catch (IncorrectCredentialsException ee) {
> return ResultBean.error("验证码错误");
> }
> {code}
>
> In class *ModularRealmAuthenticator*, why not get realm exception first?
>
> This is my extension and it works fine
> {code:java}
> //代码占位符
> @Slf4j
> public class FruitsModularRealmAuthenticator extends
> ModularRealmAuthenticator {
> @Override
> protected AuthenticationInfo doMultiRealmAuthentication(Collection<Realm>
> realms, AuthenticationToken token) throws AuthenticationException {
> AuthenticationStrategy strategy = getAuthenticationStrategy();
> AuthenticationInfo aggregate = strategy.beforeAllAttempts(realms,
> token);
> if (log.isTraceEnabled()) {
> log.trace("Iterating through {} realms for PAM authentication",
> realms.size());
> }
> AuthenticationException authenticationException = null;
> for (Realm realm : realms) {
> aggregate = strategy.beforeAttempt(realm, token, aggregate);
> if (realm.supports(token)) {
> log.trace("Attempting to authenticate token [{}] using realm
> [{}]", token, realm);
> AuthenticationInfo info = null;
> try {
> info = realm.getAuthenticationInfo(token);
> } catch (AuthenticationException e) {
> authenticationException = e;
> if (log.isDebugEnabled()) {
> String msg = "Realm [" + realm + "] threw an
> exception during a multi-realm authentication attempt:";
> log.debug(msg, e);
> }
> }
> aggregate = strategy.afterAttempt(realm, token, info,
> aggregate, authenticationException);
> } else {
> log.debug("Realm [{}] does not support token {}. Skipping
> realm.", realm, token);
> }
> }
> //这里 如果方法内抛出异常,但是会不处理直接走向下面
> //下面的逻辑是获取授权的验证结果,由于这里抛出异常,
> // 所以获取的验证结果是空,则会认为没有支持的realm
> // 所以这里提前抛出异常
> if(authenticationException != null){
> throw authenticationException;
> }
> aggregate = strategy.afterAllAttempts(token, aggregate);
> return aggregate;
> }
> }
> {code}
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)