shiro权限框架,用户登录方法的subject.login(token)会进入自定义的UserNamePasswordRealm类的doGetAuthenticationInfo身份验证方法

通常情况,doGetAuthenticationInfo写法如下:

  1. @Override
  2. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
  3. UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
  4. User loginUser = userService.getUserByName(token.getUsername());
  5. if (ObjectUtils.isEmpty(loginUser)) {
  6. throw new UnknownAccountException();
  7. }
  8. if(!loginUser.getPassWord().equals(MD5Util.md5s(String.valueOf(token.getPassword())))){
  9. throw new IncorrectCredentialsException();
  10. }
  11. //其他各种验证
  12. 。。。
  13. }

login登录方法:

  1. @ResponseBody
  2. @RequestMapping(value = "/login", method = RequestMethod.POST)
  3. public String doUserLogin(User user, HttpServletRequest request, Model model) {
  4. ...
  5. Subject subject = SecurityUtils.getSubject();
  6. UsernamePasswordToken token = new UsernamePasswordToken(user.getUserName(), user.getPassWord());
  7. try {
  8. subject.login(token);
  9. } catch (UnknownAccountException uae) {
  10. } catch (IncorrectCredentialsException ice) {
  11. } catch (LockedAccountException lae) {
  12. } catch (ExcessiveAttemptsException eae) {
  13. } catch (AuthenticationException ae) {
  14. }
  15. ...
  16. }

可是最近一次项目,发现通用的方法行不通了,doGetAuthenticationInfo方法抛出的各种异常如UnknownAccountException(包括自定义的异常),外部都无法准确捕捉。

外部login捕捉的异常统一被改写为 AuthenticationException异常(IncorrectCredentialsException等异常的父类),且异常的msg内容也被改写。内容如下:

原因在subject.login(token)的源码里,源码有这么一段:

我们进入doSingleRealmAuthentication方法,可以看见方法里面外抛了UnknownAccountException等异常。

所以如果项目中只定义了一个realm,比如用来进行登录的身份验证,外部是可以正常捕捉的。

但是此次项目我定义了两个realm,一个用来进行登录的身份验证,另一个用来登录后,验证各种请求携带的的token。

我们进入doMultiRealmAuthentication方法,内容如下

再进入afterAllAttempts的实现类,如图5。

发现抛出的异常都被统一改为AuthenticationException异常,且msg也被改写,正如图1所示。

结论

外部无法捕捉doGetAuthenticationInfo方法抛出的异常,原因在于源码,而不是自己的代码有问题。

如果没有改写源码的本事,那么外部想要捕捉各种异常,并在前端显示各种提示语,怎么办?

我的临时解决方法是,doGetAuthenticationInfo只用来验证用户名和密码,

外部直接捕捉AuthenticationException异常,其他的各种验证从doGetAuthenticationInfo方法移至login。

外部无法捕捉Realm的doGetAuthenticationInfo方法抛出的异常的更多相关文章

  1. JUnit 判断方法抛出的异常

    :比方案1更详细,可以进一步判断抛出的异常的报错信息是否符合预期 不用上面那个属性,用 try - catch(因为判断了报错信息,所以不用判断异常的类型了吧) ( 注释:MyAssert类是我自定义 ...

  2. 【Java】ArrayList 的 toArray() 方法抛出 ClassCastException 异常

    第一次用这个方法,结果冒出个莫名其妙的异常来: String[] names = (String[]) mTags.toArray(); 结果会抛出 java.lang.ClassCastExcept ...

  3. Json lib集成stucts2的使用方法 抛出 NestableRuntimeException异常的解决办法

    首先贴出struts 2.3.16需要导入的包 因为使用的是2.3 版本,必须要导入这个包,否则会报java.lang.NoClassDefFoundError: org/apache/commons ...

  4. Effective Java 第三版——74. 文档化每个方法抛出的所有异常

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  5. “全栈2019”Java异常第十一章:重写方法时只能抛出父类异常子集

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  6. 在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出MethodArgumentNotValidException异常,因此,只需要在ExceptionHandler类中添加处理对应异常的方法即可。

    在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出Method ...

  7. 应该抛出什么异常?不应该抛出什么异常?(.NET/C#)

    我在 .NET/C# 建议的异常处理原则 中描述了如何 catch 异常以及重新 throw.然而何时应该 throw 异常,以及应该 throw 什么异常呢? 究竟是谁错了? 代码中从上到下从里到外 ...

  8. Java中主线程如何捕获子线程抛出的异常

    首先明确线程代码的边界.其实很简单,Runnable接口的run方法所界定的边界就可以看作是线程代码的边界.Runnable接口中run方法原型如下: public void run(); 而所有的具 ...

  9. Response.End抛出ThreadAbortException 异常

    最近在写程序过程中遇到了一个匪夷所思的错误:Response.End()方法抛出了ThreadAbortException异常,我的代码如下: public void doResponse(){ st ...

随机推荐

  1. Entity Framework技术系列之0:开篇

    小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/shareto ...

  2. mac上使用使用rz,sz命令

    mac上使用rz,sz命令,mac上的终端不支持rz 和sz,所以安装iterm并配置使用rz和cz 1.首先需要下载安装iterm2,下载地址:下载后安装 http://www.iterm2.cn/ ...

  3. sql中如何分割字符串

    使用方式: SELECT AllItem AS BldGUID  FROM dbo.fn_split('01.02.03','.') 函数:   GO )) )) --实现split功能 的函数 as ...

  4. Android -- 带你从源码角度领悟Dagger2入门到放弃(二)

    1,接着我们上一篇继续介绍,在上一篇我们介绍了简单的@Inject和@Component的结合使用,现在我们继续以老师和学生的例子,我们知道学生上课的时候都会有书籍来辅助听课,先来看看我们之前的Stu ...

  5. Java排序算法之归并排序

    基本思想: 归并排序利用分治法,先将一个序列分成一个个子序列,然后对子序列进行排序,再把有序子序列合并为整体有序序列. 图片来自于http://www.cnblogs.com/shudonghe/p/ ...

  6. 如何解决chrome 等浏览器不支持本地ajax请求的问题

    XMLHttpRequest cannot load file:///D:/WWW/angularlx/ui-router-test/template/content.html. Cross orig ...

  7. Spring事务管理的实现方式之编程式事务与声明式事务详解

    原创说明:本博文为原创作品,绝非他处转载,转载请联系博主 1.上篇文章讲解了Spring事务的传播级别与隔离级别,以及分布式事务的简单配置,点击回看上篇文章 2.编程式事务:编码方式实现事务管理(代码 ...

  8. python自动化测试应用-第6篇(WEB测试)--Selenium元素篇

    篇6                            python自动化测试应用-Selenium基础篇 --lamecho 1.1概要 大家好!我是lamecho(辣么丑),上一篇我们搭建好p ...

  9. bzoj3112 [Zjoi2013]防守战线

    正解:线性规划. 直接套单纯形的板子,因为所约束条件都是>=号,且目标函数为最小值,所以考虑对偶转换,转置一下原矩阵就好了. //It is made by wfj_2048~ #include ...

  10. 查询表达式和LINQ to Objects

    查询表达式实际上是由编译器“预处理”为“普通”的C#代码,接着以完全普通的方式进行编译.这种巧妙的发式将查询集合到了语言中,而无须把语义改得乱七八糟 LINQ的介绍 LINQ中的基础概念 降低两种数据 ...