可以实现的方式
1、实现ResponseBodyAdvice
/**
* @author: 10086
* @date: 2021-06-18 17:34
* @description:
*/
@RestControllerAdvice
public class ResponseHandler implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter methodParameter, Class aClass) {
return true;
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
// 登录成功 统一返回
if(o instanceof OAuth2AccessToken){
OAuth2AccessToken token = (OAuth2AccessToken)o;
return Result.ok(o);
}
return o;
}
}
2、请求转发
@RestController
@RequestMapping("/oauth")
public class OauthController {
@PostMapping("/login")
public ResponseResult login(@RequestParam Map<String,Object> map){
MultiValueMap<String,Object> paramsMap=new LinkedMultiValueMap<>();
if(map.get("grant_type").equals("password")){
paramsMap.set("username",map.get("username"));
paramsMap.set("password",map.get("password"));
}else if(map.get("grant_type").equals("refresh_token")){
paramsMap.set("refresh_token",map.get("refresh_token"));
}
paramsMap.set("grant_type",map.get("grant_type"));
RestTemplate restTemplate=new RestTemplate();
restTemplate.getInterceptors().add(new BasicAuthenticationInterceptor(map.get("client_id").toString(),map.get("client_secret").toString()));
OAuth2AccessToken token=restTemplate.postForObject("http://localhost:8080/oauth/token",paramsMap,OAuth2AccessToken.class);
return new ResponseResult("登录成功!",token);
}
}
3、使用切面
public class ResponseSerializer extends StdSerializer<Response> {
public ResponseSerializer() {
super(Response.class);
}
@Override
public void serialize(Response value, JsonGenerator gen, SerializerProvider provider) throws IOException {
OAuth2AccessToken oAuth2AccessToken = (OAuth2AccessToken) value.getData();
gen.writeStartObject();
gen.writeStringField("errorcode", value.getErrorcode());
gen.writeStringField("value", value.getValue());
gen.writeObjectFieldStart("data");
gen.writeStringField("access_token", oAuth2AccessToken.getValue());
gen.writeStringField("token_type", oAuth2AccessToken.getTokenType());
gen.writeStringField("refresh_token", oAuth2AccessToken.getRefreshToken().getValue());
gen.writeNumberField("expires_in",oAuth2AccessToken.getExpiresIn());
gen.writeStringField("scope",oAuth2AccessToken.getScope().toString());
gen.writeStringField("company",oAuth2AccessToken.getAdditionalInformation().get("company").toString());
gen.writeStringField("jti",oAuth2AccessToken.getAdditionalInformation().get("jti").toString());
gen.writeEndObject();
gen.writeEndObject();
}
}
参考链接:
自定义spring security oauth /auth/token的返回内容格式_u013905744的专栏-优快云博客
Spring-Security-Oauth2学习笔记(2):自定义token返回格式_青觚的博客-优快云博客_oauth2 token格式