Salida de token con formato Spring Security OAuth

Fondo de token personalizado

Como se mencionó en el artículo anterior " Token personalizado OAuth de Spring Security (1)" , el formato de mensaje predeterminado devuelto por la interfaz oauth2.0 es el siguiente:

{  
    "access_token": "e6669cdf-b6cd-43fe-af5c-f91a65041382",  
    "token_type": "bearer",  
    "refresh_token": "da91294d-446c-4a89-bdcf-88aee15a75e8",  
    "expires_in": 43199,   
    "scope": "server"  
}  复制代码

A través del último artículo, hemos podido expandir y agregar algunos campos de negocios.

{  
    "access_token":"a6f3b6d6-93e6-4eb8-a97d-3ae72240a7b0",  
    "token_type":"bearer",  
    "refresh_token":"710ab162-a482-41cd-8bad-26456af38e4f",  
    "expires_in":42396,  
    "scope":"server",  
    "tenant_id":1,  
    "license":"made by pigx",  
    "dept_id":1,  
    "user_id":1,  
    "username":"admin"  
}  复制代码

"En algunos escenarios, necesitamos personalizar el formato del mensaje devuelto. Por ejemplo, pig usa el objeto R para devolver, y todos contienen información de código de servicio de código".

{  
    "code":1,  
    "msg":"",  
    "data":{  
        "access_token":"e6669cdf-b6cd-43fe-af5c-f91a65041382",  
        "token_type":"bearer",  
        "refresh_token":"da91294d-446c-4a89-bdcf-88aee15a75e8",  
        "expires_in":43199,  
        "scope":"server"  
    }  
}  复制代码

Método 1: HandlerMethodReturnValueHandler

  • Como su nombre indica, esta es la interfaz que Spring MVC nos proporciona para modificar el valor de retorno del método
public class FormatterToken implements HandlerMethodReturnValueHandler {  

 private static final String POST_ACCESS_TOKEN = "postAccessToken";  

 @Override  
 public boolean supportsReturnType(MethodParameter returnType) {  
     // 判断方法名是否是 oauth2 的token 接口,是就处理  
  return POST_ACCESS_TOKEN.equals(Objects  
    .requireNonNull(returnType.getMethod()).getName());  
 }  
    
  // 获取到返回值然后使用 R对象统一包装  
 @Override  
 public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer container, NativeWebRequest request) throws Exception {  
  ResponseEntity<OAuth2AccessToken> responseEntity = (ResponseEntity) returnValue;  
  OAuth2AccessToken body = responseEntity.getBody();  

  HttpServletResponse response = request.getNativeResponse(HttpServletResponse.class);  
  assert response != null;  
  WebUtils.renderJson(response, R.ok(body));  
 }  
}  复制代码
  • Inyecte FormatterToken, debe hacer esto, no use directamente la inyección MVCconfig, para asegurarse de que este controlador se ejecute antes que SpringMVC de forma predeterminada.
public class FormatterTokenAutoConfiguration implements ApplicationContextAware, InitializingBean {  
 private ApplicationContext applicationContext;  

 @Override  
 public void afterPropertiesSet() {  
  RequestMappingHandlerAdapter handlerAdapter = applicationContext.getBean(RequestMappingHandlerAdapter.class);  
  List<HandlerMethodReturnValueHandler> returnValueHandlers = handlerAdapter.getReturnValueHandlers();  

  List<HandlerMethodReturnValueHandler> newHandlers = new ArrayList<>();  
  newHandlers.add(new FormatterToken());  
  assert returnValueHandlers != null;  
  newHandlers.addAll(returnValueHandlers);  
  handlerAdapter.setReturnValueHandlers(newHandlers);  
 }  

 @Override  
 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {  
  this.applicationContext = applicationContext;  
 }  
}  复制代码

Método 2: intercepción AOP mejorada / oauth / interfaz de token

@Around("execution(* org.springframework.security.oauth2.provider.endpoint.TokenEndpoint.postAccessToken(..))")  
public Object handlePostAccessTokenMethod(ProceedingJoinPoint joinPoint) throws Throwable {  
   // 获取原有值,进行包装返回  
      Object proceed = joinPoint.proceed();  

      ResponseEntity<OAuth2AccessToken> responseEntity = (ResponseEntity<OAuth2AccessToken>) proceed;  
        OAuth2AccessToken body = responseEntity.getBody();  
        return ResponseEntity  
                  .status(HttpStatus.OK)  
                  .body(R.ok(body));  
        }  
}  复制代码

Resumen

No se recomienda modificar el formato de acceso de esta interfaz en el proyecto real. La incompatibilidad con el protocolo oauth2 hace que otros componentes no se usen normalmente.

  • swagger viene con autenticación y autorización

  • Oauth2 que viene con otros componentes de puerta de enlace

docs.konghq.com/hub/kong-in…

  • seguridad de primavera oauth2 viene con función sso

Todo invalidará el total para sopesar el daño y superar los beneficios. imagen

Supongo que te gusta

Origin juejin.im/post/5e9e3f78e51d4546c423566c
Recomendado
Clasificación