Безопасность Spring Boot JWT - получение ответа даже без передачи токена - PullRequest
0 голосов
/ 31 октября 2018

Я боролся с этим за последние 2-3 недели и просил помощи в этом посте ранее, но пока не помог. Я попытался просмотреть другие примеры и ответы в stackoverflow и, наконец, смог выполнить пару шагов. но теперь снова другое препятствие на моем пути. Очень нужна ваша помощь ...

К вашему сведению: я полностью изменяю описание этих вопросов, так как я могу понять, что я задавал ранее.

Проблема: 1) Когда я вызываю GET-запрос без передачи токена в заголовке, я все еще получаю ответ от службы отдыха

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) Если я сначала вызываю / токен, а затем вызываю / индексирую и передаю НЕПРАВИЛЬНЫЙ токен, то я получаю ошибку enter image description here 3) Если я сначала вызываю / token, а затем вызываю / index и токен передачи правильный, но у метода есть другой Authority, то я получаю ту же ошибку, что и выше (# 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;
    }
}

Заранее спасибо!

...