添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

首先抛出自定义异常这个思路是没啥问题的,至少比抛出UsernameNotFoundException来的自由些,因为在 hideUserNotFoundExceptions 属性默认为true的情况下,UsernameNotFoundException会被转换成BadCredentialsException,同时连异常信息都会被写成固定的 Bad credentials 了,部分源码参考如下:
在这里插入图片描述

  1. 首先我们要先定义一个自定义异常类,参考如下:
1. @Author:jiejie 2. @Desc: 自定义业务异常 3. @Date: 2021/3/16 11:35 4. @Version 1.0 public class BusinessException extends RuntimeException { private static final long serialVersionUID = 1L ; protected final String message ; public BusinessException ( String message ) { this . message = message ; public BusinessException ( String message , Throwable e ) { super ( message , e ) ; this . message = message ; @Override public String getMessage ( ) { return message ;
  1. 此时碰到什么 手机号已注册 等等的业务异常,都使用该异常来处理,但是会发现,还是没法抛出我们想要的code和message。
  2. 自定义异常了,那我们此时就应该自定义一个全局异常处理器类,让它捕获到BusinessException,然后再封装信息做具体的返回,参考如下:
import org.springframework.security.authentication.InternalAuthenticationServiceException;
import org.springframework.security.oauth2.common.exceptions.InvalidGrantException;
import org.springframework.security.oauth2.common.exceptions.OAuth2Exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
 * @Author: jiejie
 * @Date: 2021/4/13 下午2:11
 * @Desc: 全局处理抛出的异常
 * @Version 1.0
@ControllerAdvice
public class Oauth2ExceptionHandler {
     * 业务异常
     * @param e
     * @return
    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    public R handlerBusinessException(BusinessException e) {
        return R.failed(BizCodeEnume.BUSSINESS_EXCEPTION, e.getMessage());
    @ResponseBody
    @ExceptionHandler(value = OAuth2Exception.class)
    public R handleOauth2(OAuth2Exception e) {
        return R.failed(e.getMessage());
  1. 继续验证,发现即使抛出的是BusinessException异常,但是全局异常处理器竟然还是没捕获到,导致返回的结果还是不符合要求,此时猜想spring security捕获UsernameNotFoundException异常再转化成BadCredentialsException异常的操作,猜测异常可能是被转化了,此时只能去跟踪源码,慢慢找,最终发现,有个大的处理逻辑,就是如果匹配不到具体的异常,就会把此时的Exception转化成InternalAuthenticationServiceException异常再抛出,具体源码如下:
    在这里插入图片描述
  2. 此时的处理思路就很清晰了,在全局异常处理器中马上再加上几个要捕获处理的异常即可,修改后整体如下:
import org.springframework.security.authentication.InternalAuthenticationServiceException;
import org.springframework.security.oauth2.common.exceptions.InvalidGrantException;
import org.springframework.security.oauth2.common.exceptions.OAuth2Exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
 * @Author: jiejie
 * @Date: 2021/4/13 下午2:11
 * @Desc: 全局处理抛出的异常
 * @Version 1.0
@ControllerAdvice
public class Oauth2ExceptionHandler {
     * 业务异常
     * @param e
     * @return
    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    public R handlerBusinessException(BusinessException e) {
        return R.failed(BizCodeEnume.BUSSINESS_EXCEPTION, e.getMessage());
     * 用户名和密码错误
     * @param e
     * @return
    @ResponseBody
    @ExceptionHandler(InvalidGrantException.class)
    public R handleInvalidGrantException(InvalidGrantException e) {
        return R.failed(BizCodeEnume.BUSSINESS_EXCEPTION, e.getMessage());
     * 账户异常(禁用、锁定、过期)
     * @param e
     * @return
    @ResponseBody
    @ExceptionHandler({InternalAuthenticationServiceException.class})
    public R handleInternalAuthenticationServiceException(InternalAuthenticationServiceException e) {
        return R.failed(BizCodeEnume.BUSSINESS_EXCEPTION, e.getMessage());
    @ResponseBody
    @ExceptionHandler(value = OAuth2Exception.class)
    public R handleOauth2(OAuth2Exception e) {
        return R.failed(e.getMessage());

再次测试,发现返回结果符合需求了,如下:
在这里插入图片描述

首先抛出自定义异常这个思路是没啥问题的,至少比抛出UsernameNotFoundException来的自由些,因为在hideUserNotFoundExceptions属性默认为true的情况下,UsernameNotFoundException会被转换成BadCredentialsException,同时连异常信息都会被写成固定的Bad credentials了,部分源码参考如下:首先我们要先定义一个自定义异常类,参考如下:/** 1. @Author:jiejie 2. @Desc: 自
SpringSecurity的loadUserByUsername抛出异常无法捕获原因分析 文章目录SpringSecurity的loadUserByUsername抛出异常无法捕获原因分析1、分析原因2、解决方式2.1、方式一2.2、方式二 SpringSecurity 相信大家对它都不陌生,这是一个令我又爱又恨的框架,配置不简单,但是功能却异常强大。下面我们就一起来分析一下loadUserByUsername 里抛出自定义异常无法捕获的原因吧 嗯,话不多说,自定义异常,全局异常处理拦截器、Securit
报错信息: org.springframework.security.core.authority.SimpleGrantedAuthority;local class incompatible: stream classdesc serialVersionUID = 500, local class serialVersionUID = 520 参考人家代码写的spring-clo...
最近在学习springsecurity时,发现在自定义过滤器中抛出的异常会被设置的异常处理器捕获,而异常处理器没有携带自己想要设置的异常信息。 springsecurity配置: http.csrf().disable().cors().and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and()
使用Spring Security框架实现权限和登录验证时,可以使用AuthenticationException来判断账号或密码是否错误。当账号或密码错误时,Spring Security抛出AuthenticationException异常。你可以在你的代码中使用try-catch语句来捕获这个异常,并根据具体的异常类型来判断是账号错误还是密码错误。 try { authen...
遇到的问题 先说下我的需求:当用户输入不存在的用户名进行登录时,返回账户不存在的提示。 在做项目的时候使用 Spring Security 作用户登录和授权,定义了 UserDetailsService 的实现类,在这个实现类的 loadUserByUsername(String username) 方法下,我是先判断 username 账户是否存在,如果不存在就直接抛出异常,告诉用户账户不存在的信息。抛出异常代码如下: if (user == null) { throw new UsernameNotF
是的,在 Spring Boot 中使用 AOP 时,如果在切面类中抛出自定义异常,实际上会被包装成一个 `UndeclaredThrowableException` 异常抛出。这是因为,在使用 JDK 动态代理的 AOP 实现中,代理类方法的调用是通过反射来实现的,当在切面类中抛出异常时,如果该异常并不是被代理类方法声明抛出的异常,那么就会被包装成一个 `UndeclaredThrowableException` 异常抛出。 为了解决这个问题, 你可以在切面类中捕获你的自定义异常,然后用另外的方式来处理(例如记录日志,发送邮件等) 也可以改用CGLIB的代理方式。只要在配置类上加上 @EnableAspectJAutoProxy(proxyTargetClass = true) 选择CGLIB的代理方式即可,但是CGLIB比JDK多一些内存占用。