Персонализированный фон токена
предыдущий пост«Персонализированный токен Spring Security OAuth (1)»Упоминается, что формат пакетов, возвращаемых интерфейсом oauth2.0 по умолчанию, следующий:
{
"access_token": "e6669cdf-b6cd-43fe-af5c-f91a65041382",
"token_type": "bearer",
"refresh_token": "da91294d-446c-4a89-bdcf-88aee15a75e8",
"expires_in": 43199,
"scope": "server"
}
Благодаря предыдущей статье мы смогли расширить и добавить некоторые бизнес-поля.
{
"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"
}
"«В некоторых сценариях нам нужно настроить формат возвращаемого сообщения. Например, pig использует для возврата объект R, каждый из которых содержит информацию о бизнес-коде кода»."
{
"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"
}
}
Метод 1: HandlerMethodReturnValueHandler
- Как следует из названия, это интерфейс, который Spring MVC предоставляет нам для изменения возвращаемого значения метода.
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));
}
}
- При внедрении FormatterToken он должен обрабатываться следующим образом.Не используйте внедрение MVCconfig напрямую, чтобы гарантировать, что этот обработчик будет выполнен раньше, чем SpringMVC по умолчанию.
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;
}
}
Способ 2: перехват aop улучшает интерфейс /oauth/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));
}
}
Суммировать
В реальном проекте не рекомендуется изменять формат доступа этого интерфейса, он не совместим с протоколом oauth2, поэтому другие компоненты не могут нормально использоваться, например
- Swagger поставляется с аутентификацией и авторизацией
- oauth2, который поставляется с другими компонентами шлюза
https://docs.konghq.com/hub/kong-inc/oauth2/
- Функция sso, которая поставляется с Spring Security oauth2
Все не смогут оценить общий вред больше, чем пользу