过去2-3周以来,我一直在为此苦苦挣扎,并在较早的时候要求这篇文章的帮助,但目前还没有帮助。我尝试研究一下stackoverflow中的其他示例和答案,最终能够执行几个步骤。但现在又是我的另一个障碍。真的需要您的帮助...
fyi:由于我能够弄清楚我之前提出的问题,因此我将完全改变对这些问题的描述。
问题:1)当我调用GET请求而未在标头中传递Token时,我仍从其余服务获得响应
2)当出现错误请求(404)时,如何自定义响应。无效的令牌或未提供令牌或无法访问
我做了什么:1)我能够通过调用localhost:8080 / token并通过传递用户名和密码来成功验证用户身份。如果我通过了错误的凭据,则会引发错误。
我观察到的:
1)如果我最初不调用localhost:8080 / token但调用/ index,那么我会报错
{
"timestamp": 1541597538738,
"status": 401,
"error": "Unauthorized",
"exception": "org.springframework.security.access.AccessDeniedException",
"message": "UNAUTHARIZED",
"path": "/index"
}
2)如果我先调用/ token,然后又调用/ index和传递WRONG令牌,那么我会出错
3)如果我先调用/ token,然后又调用/ index和传递正确的令牌,但是该方法具有不同的权限,那么我将得到与上述相同的错误(#2)
4)如上面问题中所述:即,当我调用/ index并且不传递令牌时,它会返回良好的响应。 -这是我要解决的主要问题,需要您的帮助。
整个代码在github中。仅供参考:如果要运行代码,则必须更改LDAP URL / userDn和密码,也可以使用XYZ.ldif文件。我的代码中的LDIF不是正确的代码,但是您可以更改和测试它。
我认为这里是问题,但我不知道如何解决。
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;
}
}
谢谢!