Spring Boot 如何让Swagger UI要求我提供授权头而不是我的用户实体?

qjp7pelc  于 2023-04-30  发布在  Spring
关注(0)|答案(1)|浏览(128)

这是我第一次问问题如果我做错了请告诉我。
我有一个端点,看起来像这样:

@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的一小部分并没有回答我的问题。

2wnc66cl

2wnc66cl1#

好吧,我通过问魔鬼的神器找到了答案。我将在这里留下答案,希望它能帮助那些可能有类似问题的人。你要确保你把@ApiIgnore放在你不想显示的任何字段中(在本例中是UserEntity),然后让它请求授权头,你用正确的值声明@ApiImplicitParam。

@PostMapping("/operation/finiquito")
  @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "Authorization Bearer token", required = true, dataType = "string", paramType = "header")
    })
    public ResponseEntity<?> calculateFiniquito(@ApiIgnore @AuthenticationPrincipal UserEntity user,
            @RequestBody FiniquitoRequest finiquito, HttpServletRequest request)
            throws IOException {

        return service.calculateFiniquitoAndCreateHistory(user, finiquito, request);

    }

相关问题