Spring Boot JWT安全性-即使不传递令牌也可以响应

时间:2018-10-31 19:32:51

标签: spring-boot jwt spring-ldap spring-security-ldap

过去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令牌,那么我会出错 enter image description here 3)如果我先调用/ token,然后又调用/ index和传递正确的令牌,但是该方法具有不同的权限,那么我将得到与上述相同的错误(#2)

4)如上面问题中所述:即,当我调用/ index并且不传递令牌时,它会返回良好的响应。 -这是我要解决的主要问题,需要您的帮助。 enter image description here

整个代码在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;
    }
}

谢谢!

0 个答案:

没有答案