Spring(Cloud,OAuth2中/oauth/token的返回内容格式)

Spring Cloud OAuth2 生成access token的请求/oauth/token的返回内容就需要自定义,本文就详细介绍一下,感兴趣的可以了解一下

Spring,Cloud,OAuth2中/oauth/token的返回内容格式,久久派带你了解更多相关信息。

目录
  • 背景
  • 实现原理
  • 代码实现
    • 相关类
    • 关键切面拦截器

背景

在前后端分离的项目中,一般后端返回给前端的格式是一个固定的json格式。在这个前提下,Spring Cloud OAuth2 生成access token的请求/oauth/token的返回内容就需要自定义。

访问/oauth/token示例如下:

Spring(Cloud,OAuth2中/oauth/token的返回内容格式)

原始返回值的格式如下:

Spring(Cloud,OAuth2中/oauth/token的返回内容格式)

我们希望使用我们自己固定的json格式,如下:

Spring(Cloud,OAuth2中/oauth/token的返回内容格式)

实现原理

原理就是通过切面编程实现对/oauth/token端点请求的结果进行拦截封装处理,由于/oauth/token是Spring Cloud OAuth2的内部端点,因此需要对相关的Spring源码进行分析。最终定位到

org.springframework.security.oauth2.provider.endpoint.TokenEndpoint.postAccessToken()

方法上。

代码实现

相关类

CodeEnum.java

package com.wongoing.common.model;/** * @description: 代码枚举 * @author: zheng * @date: Created in 2021/1/26 11:18 * @version: 0.0.1 * @modified By: */public enum CodeEnum {    SUCCESS(0),    ERROR(1);    private Integer code;    CodeEnum(Integer code) {        this.code = code;    }    public Integer getCode() {        return this.code;    }}

Result.java

package com.wongoing.common.model;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.io.Serializable;/** * @description: Rest API 接口方法返回类型定义 * @author: zheng * @date: Created in 2021/1/26 13:25 * @version: 0.0.1 * @modified By: */@Data@NoArgsConstructor@AllArgsConstructorpublic class Result<T> implements Serializable {    private T data;    private Integer code;    private String msg;    public static <T> Result<T> of(T data, Integer code, String msg) {        return new Result<>(data, code, msg);    }    public static <T> Result<T> succeed(String msg) {        return of(null, CodeEnum.SUCCESS.getCode(), msg);    }    public static <T> Result<T> succeed(T model, String msg) {        return of(model, CodeEnum.SUCCESS.getCode(), msg);    }    public static <T> Result<T> succeed(T model) {        return of(model, CodeEnum.SUCCESS.getCode(), \"\");    }    public static <T> Result<T> failed(String msg) {        return of(null, CodeEnum.ERROR.getCode(), msg);    }    public static <T> Result<T> failed(T model, String msg) {        return of(model, CodeEnum.ERROR.getCode(), msg);    }}

关键切面拦截器

在uaa项目中定义OauthTokenAspect.java

package com.wongoing.oauth2.filter;import com.wongoing.common.constant.SecurityConstants;import com.wongoing.common.context.TenantContextHolder;import com.wongoing.common.model.Result;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.security.authentication.InsufficientAuthenticationException;import org.springframework.security.core.Authentication;import org.springframework.security.oauth2.common.OAuth2AccessToken;import org.springframework.security.oauth2.common.util.OAuth2Utils;import org.springframework.security.oauth2.provider.OAuth2Authentication;import org.springframework.stereotype.Component;import java.security.Principal;import java.util.Map;/** * @description: oauth-token拦截器 * 1. 赋值租户 * 2. 统一返回token格式 * * @author: zheng * @date: Created in 2021/7/12 16:25 * @version: 0.0.1 * @modified By: */@Slf4j@Component@Aspectpublic class OauthTokenAspect {    @Around(\"execution(* org.springframework.security.oauth2.provider.endpoint.TokenEndpoint.postAccessToken(..))\")    public Object handleControllerMethod(ProceedingJoinPoint joinPoint) throws Throwable {        try {            Object[] args = joinPoint.getArgs();            Principal principal = (Principal) args[0];            if (!(principal instanceof Authentication)) {                throw new InsufficientAuthenticationException(\"There is no client authentication. Try adding an appropriate authentication filter.\");            }            String clientId = this.getClientId(principal);            Map<String, String> parameters = (Map<String, String>) args[1];            String grantType = parameters.get(OAuth2Utils.GRANT_TYPE);            //保存租户id            TenantContextHolder.setTenant(clientId);            Object proceed = joinPoint.proceed();            if (SecurityConstants.AUTHORIZATION_CODE.equals(grantType)) {                /**                 * 如果使用 @EnableOAuth2Sso 注解不能修改返回格式,否则授权码模式可以统一改                 * 因为本项目的 sso-demo/ss-sso 里面使用了 @EnableOAuth2Sso 注解,所以这里就不修改授权码模式的token返回值了                 */                return proceed;            } else {                ResponseEntity<OAuth2AccessToken> responseEntity = (ResponseEntity<OAuth2AccessToken>) proceed;                OAuth2AccessToken body = responseEntity.getBody();                return ResponseEntity                        .status(HttpStatus.OK)                        .body(Result.succeed(body));            }        } finally {            TenantContextHolder.clear();        }    }    private String getClientId(Principal principal) {        Authentication client = (Authentication) principal;        if (!client.isAuthenticated()) {            throw new InsufficientAuthenticationException(\"The client is not authenticated.\");        }        String clientId = client.getName();        if (client instanceof OAuth2Authentication) {            clientId = ((OAuth2Authentication) client).getOAuth2Request().getClientId();        }        return clientId;    }}

其中的常量值:

public abstract class OAuth2Utils {	public static final String GRANT_TYPE = \"grant_type\";}

public interface SecurityConstants {	/**     * 授权码模式     */    String AUTHORIZATION_CODE = \"authorization_code\";}

到此这篇关于Spring Cloud OAuth2中/oauth/token的返回内容格式的文章就介绍到这了,更多相关Spring Cloud OAuth2返回内容格式内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/8636.html

(0)
上一篇 2021-07-30 23:24:08
下一篇 2021-07-30 23:24:12

相关推荐

  • 女性常吃碱性的好处(有哪些碱性食物)

    女性从13~14岁左右面临月经初潮,28~35天来一次月经,一直持续到45~55岁才绝经,由此看来,月经陪伴女性半辈子。月经对女性来说可爱又可恨,能通过月经了解身体状况,但又因为月经所引起的各种身体不适而烦恼不已。女性不仅仅月经期做好保健,月经干净后…

    2022-01-17
    0
  • 猫超卡怎么用(猫超卡有必要买吗)

    在天猫超市的界面中,有一个天猫超市卡。往卡里面充值金额的话,下次购物,超市卡中的金额便可直接抵扣。为了让更多的用户充值猫超卡,官方也是给出了很多的满赠福利,这些福利也是为了让更多的用户可以充值猫超卡。那所谓的天猫超市卡,到底值不值得我们用户购买呢?其

    2021-12-31
    0
  • 签合同的公司和交社保的公司不一样(自愿只签合同不交社保)

    法律分析:劳动合同跟社保可以不是同一个公司,可以得到赔偿,在哪个公司签订劳动合同,说明与哪个公司建立了劳动关系,该公司就必须给员工缴纳社保。如果是劳务派遣公司代缴社保,是可以的。不管用人单位和职工是否签订了书面的劳动合同,只要双方存在劳动关系的,都必

    2022-01-12
    0
  • 我国前三季度移动互联网累计流量达1608亿GB(同比增长35.8%)

    久久派网10月20日消息,据工业和信息化部网站,前三季度,我国电信业务收入累计完成11084亿元,同比增长8.4%,增速较上年同期提升5.2个百分点。按照上年不变价计算的电信业务总量为12390亿元,同比增长28%。久久派网了

    2021-10-20
    0
  • 费用报销管理流程图(报销流程管理办法)

    前段时间,公司召开了年中会议,在会议上,财务总监曾这样形容费用报销的重要性:“我看过很多公司,公司制度的失效,都是从费用报销开始的。”说实话当时听到这话还真有点让人震撼的。很多财务人员也都知道,在实际工作中,一些员工和部门的不配合,特别是有

    2021-12-16 用户投稿
    0
  • 成都社保补缴的方法(成都社保补缴在哪里)

    工作是每个人都离不开的话题,有没有工作、在哪里工作、工资待遇如何?不论是走亲访友还是茶余饭后这些都是大家闲聊的话题!为了更加良好的工作发展或者是自身原因辞职想休息一段时间还是辞职想要自己创业成就属于自己的事业,这些都是现在年轻人辞职的原因。

    2021-12-16
    0

发表回复

登录后才能评论