oauth2.0 认证服务器异常信息

密码错误默认的异常信息如下

账号无效的异常

这里的无效用户 是我在程序中抛出来异常,默认也不这样, 但是不管怎么, 都不是我们想要的, 我想返回给前端自定义的,比如 有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;
    }


}

效果:

 

 

你如果有好的办法还请指教

 

 

 

 

 

 

Java OAuth2.0服务端凭证是一种安全框架设计用于授权服务器向客户端应用提供受限资源访问权限。它基于HTTP标准,提供了一种轻量级、自包含、依赖于HTTP的安全机制。 OAuth2.0服务端模式的基本流程包括以下几个步骤: 1. **用户同意授权**:当客户端需要访问受限资源时,它会引导用户到授权服务器(通常由应用的所有者运营),并请求授权。此过程允许用户授予特定权限给客户端应用,并可以选择仅允许读取还是修改某些数据。 2. **生成访问令牌**:如果用户授权成功,则授权服务器会生成一个临时的授权码,并将它返回给客户端。然后,客户端使用这个授权码和自身的身份信息(例如客户端ID和秘密)向授权服务器请求访问令牌。 3. **获取访问令牌**:客户端使用POST方法向授权服务器发送请求,携带授权码、客户端的身份信息以及一些额外的参数(如客户端类型的指示)。服务器验证这些信息并确认授权码的有效性。若通过验证,则服务器生成访问令牌并将它返回给客户端。 4. **使用访问令牌**:一旦客户端获得访问令牌,它就可以使用该令牌来请求资源服务器提供的受保护资源了。访问令牌包含了足够的信息服务器相信有权访问这些资源,并且可以控制对资源的访问细节(如时间限制、是否只读等)。 5. **刷新访问令牌**:随着时间的推移,访问令牌可能会过期。为了继续访问资源,客户端需要刷新访问令牌。这一过程通过向授权服务器发送一个新的刷新令牌完成。刷新令牌在初次申请访问令牌时就一并获得了,它可以用来换取新的访问令牌而不需用户的进一步交互。 ### 相关问题: 1. **如何在Java中实现OAuth2.0服务端模式?** - 需要选择合适的开源库,如Spring Security OAuth2 或 Okta Spring Boot Starter 等,它们可以帮助简化配置和实现过程。 - 配置认证中心、客户端信息、回调处理逻辑等关键组件。 - 实现适当的REST API控制器来处理OAuth2.0的相关API请求。 2. **如何确保OAuth2.0服务的安全性和合规性?** - 使用强加密算法保护敏感信息,如利用HTTPS协议传输数据。 - 定期审计权限设置和访问日志,检查是否有异常活动。 - 遵守相关的数据保护法规,如GDPR或CCPA,在必要时实施更严格的隐私政策和数据处理规则。 3. **OAuth2.0在哪些场景下特别有用?** - 当应用程序需要集成第三方服务并共享有限的数据集时。 - 对于Web应用程序和移动应用的授权机制,以保护用户数据的同时提供便捷的用户体验。 - 当系统需要动态地授权不同级别的访问权限给不同的用户角色时。 通过以上讨论,我们可以看到Java OAuth2.0服务端凭证提供了一套强大而灵活的安全解决方案,适用于多种应用场景,特别是那些需要高度安全性同时又希望保持良好用户体验的应用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值