shiro自定义realm中捕捉异常的问题

chanchaw 2018-11-24 09:25:24
*** 我的java项目采用的技术架构是:SpringMVC+Mybatis+Shiro
*** 在自定义的realm中检测密码的代码如下:

if(checkPwd(credentials,encryptUIPwd)==false) {
System.out.println("ShiroRealm中的认证方法中密码错误");
IncorrectCredentialsException ie = new IncorrectCredentialsException("密码错误!");
System.out.println("即将抛出的异常对象是:" + ie.toString());
throw ie;
}


*** 服务层捕捉异常的代码是:

try {
System.out.println("try...即将触发realm中的认证方法");
currentUser.login(token);
System.out.println("currentUser.login(token); 执行完毕");
} catch (UnknownAccountException e0) {
System.out.println("controller接收到的异常对象是:" + e0.toString());
System.out.println("PermUserServiceImpl#login:账号不存在,返回的JsonData是:");
JsonData jd = JsonData.fail("账号不存在!");
jd.setData("");
System.out.println(jd);
return jd;

} catch (IncorrectCredentialsException e1) {
System.out.println("controller接收到的异常对象是:" + e1.toString());
System.out.println("PermUserServiceImpl#login:密码错误,返回的JsonData是:");
JsonData jd = JsonData.fail("密码错误!");
jd.setData("");
System.out.println(jd);
return jd;
} catch(LockedAccountException e2) {
System.out.println("controller接收到的异常对象是:" + e2.toString());
System.out.println("PermUserServiceImpl#login:账号被锁定,返回的JsonData是:");
JsonData jd = JsonData.fail("账号被锁定!");
jd.setData("");
System.out.println(jd);
return jd;

} catch (AccountException e3) {
System.out.println("controller接收到的异常对象是:" + e3.toString());
System.out.println("PermUserServiceImpl#login:账号异常,返回的JsonData是:");
JsonData jd = JsonData.fail("账号异常!");
jd.setData("");
System.out.println(jd);
return jd;
} catch(CredentialsException e4) {
System.out.println("controller接收到的异常对象是:" + e4.toString());
System.out.println("PermUserServiceImpl#login:凭证异常,返回的JsonData是:");
JsonData jd = JsonData.fail("凭证异常!");
jd.setData("");
System.out.println(jd);
return jd;
} catch(UnsupportedTokenException e5) {
System.out.println("controller接收到的异常对象是:" + e5.toString());
System.out.println("PermUserServiceImpl#login:不支持的token异常,返回的JsonData是:");
JsonData jd = JsonData.fail("不支持的token异常");
jd.setData("");
System.out.println(jd);
return jd;
} catch (AuthenticationException e6) {
System.out.println("controller接收到的异常对象是:" + e6.toString());
System.out.println("PermUserServiceImpl#login:未知的登录异常,返回的JsonData是:");
JsonData jd = JsonData.fail("未知的登录异常!");
jd.setData("");
System.out.println(jd);
return jd;
}


*** 自定义的realm中检测到密码错误后,抛出了异常IncorrectCredentialsException,但是在服务层中却捕捉到了
异常AuthenticationException,这是为什么??
- 打印日志出来看到的。
自定义realm中抛出异常前打印到console的结果是:

即将抛出的异常对象是:org.apache.shiro.authc.IncorrectCredentialsException: 密码错误!

在服务层捕捉到异常时候打印到console的结果是:
controller接收到的异常对象是:org.apache.shiro.authc.AuthenticationException: Authentication token of type [class org.apache.shiro.authc.UsernamePasswordToken] could not be authenticated by any configured realms. Please ensure that at least one realm can authenticate these tokens.



...全文
654 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenjian026 2018-11-24
  • 打赏
  • 举报
回复
doGetAuthenticationInfo 方法要抛出异常AuthenticationException
亲爱的Joe 2018-11-24
  • 打赏
  • 举报
回复
据我所知,这个异常不该由你手动抛出。shiro自己会验证你的密码吧
public SimpleAuthenticationInfo(Object principal, Object credentials, String realmName) {
this.principals = new SimplePrincipalCollection(principal, realmName);
this.credentials = credentials;
}

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧