密码错误默认的异常信息如下
账号无效的异常
这里的无效用户 是我在程序中抛出来异常,默认也不这样, 但是不管怎么, 都不是我们想要的, 我想返回给前端自定义的,比如 有status,code msg 等等,
自定义 MyWebResponseExceptionTranslator 实现 WebResponseExceptionTranslator
package com.yyc.platform.uaa.config;
import com.yyc.platform.common.utils.JsonResult;
import com.yyc.platform.uaa.exception.UserNotFountException;
import org.omg.CORBA.DynAnyPackage.Invalid;
import org.springframework.http.ResponseEntity;
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.security.oauth2.provider.error.WebResponseExceptionTranslator;
/**
* @Auther: yangyongcui
* @Date: 2020/7/15: 15:22
* @Description:
*/
public class MyWebResponseExceptionTranslator implements WebResponseExceptionTranslator<OAuth2Exception> {
private static final String INVALID_TOKEN_ERROR_DESCRIPTION = "Token was not recognised";//token 无效
private static final String INVALID_AUTHORIZATION_CODE = "Invalid authorization code";//授权码无效
private static final String INVALID_USER = "无效用户";//密码有误
private static final String BAD_CREDENTIALS = "Bad credentials";//密码有误
@Override
public ResponseEntity translate(Exception e) {
if (e.getMessage().startsWith(INVALID_AUTHORIZATION_CODE)) {//无效授权码
return ResponseEntity.ok().body(JsonResult.fail(e.getMessage(), "1001"));
} else if (INVALID_USER.equals(e.getMessage())) {//无效用户
return ResponseEntity.ok().body(JsonResult.fail(e.getMessage(), "1002"));
} else if (BAD_CREDENTIALS.equals(e.getMessage())) {
return ResponseEntity.ok().body(JsonResult.fail("密码错误", "1003"));
} else if (INVALID_TOKEN_ERROR_DESCRIPTION.equals(e.getMessage())) {
return ResponseEntity.ok().body(JsonResult.fail("token无效", "1004"));
} else {
return ResponseEntity.ok().body(JsonResult.fail(e.getMessage()));
}
}
}
我们可以看到真正有异常的时候,oauth2.0 并没有给我们明确的区分是哪种异常类型,比如密码错误和授权码错误,都是一个异常
我们只能通过返回的描述进行判断,而且无效的token那个异常,我们连异常类型都拿不到
如下.是密码错误和者授权码错误的信息
无效token ,连异常类型都拿不到
所以,有的只能根据描述进行处理,如果各位有好的处理方式,可以指导一下,不胜感激
有了上面的异常处理类,然后进行配置
异常中用到的 JsonResult 类是我自定义的, 可以根据自己需要修改
package com.yyc.platform.common.utils;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
/**
* @Auther: yangyongcui
* @Date: 2019/3/2: 14:59
* @Description:返回前端的统一类
*/
@Data
public class JsonResult<T> implements Serializable {
private static final long serialVersionUID = -8847260026696169235L;
/***
* 默认的操作值
*/
private static final String SUCCESS_CODE = "0";
private static final String SUCCESS_MSG = "操作成功";
private static final String SUCCESS_STATUS = "success";
private static final String FAIL_CODE = "9999";
private static final String FAIL_MSG = "操作失败";
private static final String FAIL_STATUS = "fail";
/**
* 操作状态 提示 成功还是失败
*/
private String status = SUCCESS_STATUS;
/*
具体的一些后台返回给前端的消息
*/
private String msg = SUCCESS_MSG;
/*
返回的操作码 可以供前端根据不同的状态码进行判断
*/
private String code = SUCCESS_CODE;
private Long count = 0L;
/*
数据
*/
private T data;
public T getData() {
return this.data;
}
public JsonResult() {
}
/**
* 只是返回成功 可以不带数据
*
* @return
*/
public static <T> JsonResult<T> success() {
return new JsonResult<>();
}
/**
* 返回前端成功的消息和状态码都自定义
*
* @param message
* @return
*/
public static JsonResult success(String message, String code) {
JsonResult success = JsonResult.success();
success.setMsg(message);
success.setCode(code);
return success;
}
public static <T> JsonResult<T> success(T data) {
JsonResult<T> success = JsonResult.success();
success.setData(data);
return success;
}
/**
* 操作失败
*
* @return
*/
public static JsonResult fail() {
return JsonResult.fail(FAIL_MSG);
}
/**
* 操作失败自定义消息
*
* @return
*/
public static JsonResult fail(String message) {
return JsonResult.fail(message, null);
}
/**
* 操作失败自定义消息和状态码
*
* @return
*/
public static JsonResult fail(String message, String code) {
JsonResult jsonResult = new JsonResult();
jsonResult.setStatus(FAIL_STATUS);
if (StringUtils.isNotBlank(message)) {
jsonResult.setMsg(message);
} else {
jsonResult.setMsg(FAIL_MSG);
}
if (StringUtils.isNotBlank(code)) {
jsonResult.setCode(code);
} else {
jsonResult.setCode(FAIL_CODE);
}
return jsonResult;
}
}
效果:
你如果有好的办法还请指教