Spring Boot JWT security - obtendo resposta mesmo sem passar o token
Estive lutando desde as últimas 2-3 semanas e solicitei ajuda neste post mais cedo, mas ainda não há ajuda. Tentei procurar outros exemplos e respostas no stackoverflow e finalmente consegui seguir algumas etapas. mas agora novamente outro obstáculo no meu caminho. Realmente preciso da sua ajuda ...
fyi: Estou mudando completamente a descrição dessas perguntas, pois sou capaz de descobrir o que pedi ante
Problema: 1) Quando ligo para uma solicitação GET sem passar o Token no cabeçalho, ainda estou recebendo resposta do serviço de repouso
2) Como posso personalizar a resposta quando há uma solicitação inválida (404), por exemplo token inválido ou sem token fornecido ou sem acesso
O que fiz: 1) Consigo autenticar o usuário com êxito chamando localhost: 8080 / token e passando nome de usuário e senha. Se eu passar credenciais erradas, gera erro.
O que eu observei:
1) Se eu não chamar localhost: 8080 / token no início, mas chamar / index, estou recebendo o erro
{
"timestamp": 1541597538738,
"status": 401,
"error": "Unauthorized",
"exception": "org.springframework.security.access.AccessDeniedException",
"message": "UNAUTHARIZED",
"path": "/index"
}
2) Se eu chamar / token no início e depois chamar / indexar e passar o token errado, estou recebendo o erro 3) Se eu chamar / token no início e depois chamar / indexar e passar o token correto, mas o método tiver uma autoridade diferente, estou recebendo o mesmo erro acima (nº 2)
4) Conforme descrito acima no Problema: ou seja, quando eu ligo / indexo e NÃO transmito token, ele retorna uma boa resposta. - Esse é o principal problema que quero resolver e preciso de sua ajuda.
O código inteiro está em github. FYI: Se você deseja executar o código, é necessário alterar a URL / userDn e a senha LDAP ou pode usar um arquivo XYZ.ldif. O LDIF no meu código não é o correto, mas você pode alterá-lo e testá-l
Acho o problema aqui, mas não sei como resolvê-l
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Autowired
private JwtTokenProvider tokenProvider;
private static final Logger logger = LoggerFactory.getLogger(JwtAuthenticationFilter.class);
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String jwt = getJwtFromRequest(request);
if (StringUtils.hasText(jwt) && tokenProvider.validateToken(jwt)) {
UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(request, response);
}
private String getJwtFromRequest(HttpServletRequest request) {
String bearerToken = request.getHeader("Authorisation");
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Basic ")) {
return bearerToken.substring(6, bearerToken.length());
}
return null;
}
}
Desde já, obrigado