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
- seguridad de primavera oauth2 viene con función sso
Todo invalidará el total para sopesar el daño y superar los beneficios.