zoukankan      html  css  js  c++  java
  • 外部无法捕捉Realm的doGetAuthenticationInfo方法抛出的异常

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

    通常情况,doGetAuthenticationInfo写法如下:

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
    	UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
    	User loginUser = userService.getUserByName(token.getUsername());
    	if (ObjectUtils.isEmpty(loginUser)) {
    		throw new UnknownAccountException();
    	}
    	if(!loginUser.getPassWord().equals(MD5Util.md5s(String.valueOf(token.getPassword())))){
    		throw new IncorrectCredentialsException();
    	}
    	//其他各种验证
    	。。。
    }
    
    

    login登录方法:

    @ResponseBody
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String doUserLogin(User user, HttpServletRequest request, Model model) {
    	...
    	Subject subject = SecurityUtils.getSubject();
    	UsernamePasswordToken token = new UsernamePasswordToken(user.getUserName(), user.getPassWord());
    	try {
    		subject.login(token);
    	} catch (UnknownAccountException uae) {
    		
    	} catch (IncorrectCredentialsException ice) {
    		
    	} catch (LockedAccountException lae) {
    		
    	} catch (ExcessiveAttemptsException eae) {
    		
    	} catch (AuthenticationException ae) {
    		
    	}
    	...
    }
    

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

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

    图1

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

    图2

    我们进入doSingleRealmAuthentication方法,可以看见方法里面外抛了UnknownAccountException等异常。
    所以如果项目中只定义了一个realm,比如用来进行登录的身份验证,外部是可以正常捕捉的。

    图3

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

    图4

    再进入afterAllAttempts的实现类,如图5。
    发现抛出的异常都被统一改为AuthenticationException异常,且msg也被改写,正如图1所示。

    图5

    结论

    外部无法捕捉doGetAuthenticationInfo方法抛出的异常,原因在于源码,而不是自己的代码有问题。
    如果没有改写源码的本事,那么外部想要捕捉各种异常,并在前端显示各种提示语,怎么办?

    我的临时解决方法是,doGetAuthenticationInfo只用来验证用户名和密码,
    外部直接捕捉AuthenticationException异常,其他的各种验证从doGetAuthenticationInfo方法移至login。

  • 相关阅读:
    CI框架 -- 核心文件 之 Loader.php(加载器)
    CI框架 -- 核心文件 之 Lang.php(加载语言包)
    CI框架 -- 核心文件 之 Input.php(输入数据处理文件)
    CI框架 -- 核心文件 之 Hooks.php
    CI框架 -- 核心文件 之 Exceptions.php
    CI框架 -- 配置文件config.php
    网站后台发通知页面效果图
    校内通知-Notifications表增加老师,家长,学生发送范围字段
    jqGrid设置指定行的背景色
    SQLServer数据库监控代码
  • 原文地址:https://www.cnblogs.com/wangxin37/p/6397969.html
Copyright © 2011-2022 走看看