这是我第一次问问题如果我做错了请告诉我。
我有一个端点,看起来像这样:
@PostMapping("/operation/finiquito")
public ResponseEntity<?> calculateFiniquito(@AuthenticationPrincipal UserEntity user,
@RequestBody FiniquitoRequest finiquito, HttpServletRequest request)
throws IOException {
return service.calculateFiniquitoAndCreateHistory(user, finiquito, request);
}
对于某些上下文,它是一个端点,计算一个“Finiquito”,这是你被解雇时得到的检查的名称,但在西班牙语。
端点完美地工作,获得认证主体的方式是通过过滤器,该过滤器本质上从请求中获得令牌,然后,如果其有效,则它将从有效载荷中获得用户ID并在数据库中搜索所述用户,该数据库本质上表示参数中的UserEntity。
我也展示了过滤器以防万一:
@Log
@Component
@RequiredArgsConstructor
public class JwtAuthorizationFilter extends OncePerRequestFilter {
private final JwtTokenProvider tokenProvider;
private final ServicioUsuarioUserDetails userDetailsService;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
try {
String token = getJwtFromRequest(request);
if (StringUtils.hasText(token) && tokenProvider.validateToken(token)) {
Long userId = tokenProvider.getUserIdFromJWT(token);
UserEntity user = (UserEntity) userDetailsService.loadUserById(userId);
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(user,user.getRoles(), user.getAuthorities());
authentication.setDetails(new WebAuthenticationDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
} catch (Exception ex) {
//Just a log in case it fails, it translates to "haven´t been able to stablish user //authentication".
log.info("No se ha podido establecer la autenticación de usuario en el contexto de seguridad");
}
filterChain.doFilter(request, response);
}
private String getJwtFromRequest(HttpServletRequest request) {
String bearerToken = request.getHeader(JwtTokenProvider.TOKEN_HEADER);
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(JwtTokenProvider.TOKEN_PREFIX)) {
return bearerToken.substring(JwtTokenProvider.TOKEN_PREFIX.length(), bearerToken.length());
}
return null;
}
}
我正在使用Springfox for Swagger,我的配置docket bean如下:
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2).select()
.apis(RequestHandlerSelectors.basePackage("com.operaciones.microservicio.Controller"))
.paths(PathSelectors.any())
.build();
}
我的问题是:有没有办法让SwaggerUI不要求UserEntity,而只要求带注解的Authorization Header,或者如果我想让Swagger UI相应地表示它,我必须重写这个端点和潜在的过滤器?
如果可能的话,我宁愿避免重写我的代码,因为我认为这样做看起来很干净,但因为我仍然是一个初级,我认为这可能是非常糟糕的做法,也许?
一些补充说明:如果我上面的代码有什么非常错误的地方,或者有什么建议,我也会采纳。我是一个初级开发人员,所以任何可以帮助我更好地编写代码的批评总是受欢迎的。
我试过在堆栈溢出上搜索解决方案,但我发现的大多数东西都与ASP有关,而我发现的Java的一小部分并没有回答我的问题。
1条答案
按热度按时间2wnc66cl1#
好吧,我通过问魔鬼的神器找到了答案。我将在这里留下答案,希望它能帮助那些可能有类似问题的人。你要确保你把@ApiIgnore放在你不想显示的任何字段中(在本例中是UserEntity),然后让它请求授权头,你用正确的值声明@ApiImplicitParam。