Использование авторизации на основе @Secured on Token для конечных точек REST

Я пытался выполнить аутентификацию и авторизацию на основе токена (JWT) для моего приложения Spring. Конечно, через Spring Security. Я смог выполнить аутентификацию через фильтры. Однако я не могу авторизовать запрос на основе токена JWT, отправленного по HTTP-запросу. Ниже мой пример кода.

TestRest.java (RestController)

@RestController
public class TestRest {

    @GetMapping(value = "/protected")
    @Secured("ROLE_USER")
    public @ResponseBody String protectedMethod () {
        logger.info("Entering Proceted Method! is {}" , SecurityContextHolder.getContext().getAuthentication().getAuthorities());
        return "I am Protected!";
    }
}

JwtAuthTokenFilter.java (фильтр токенов)

@Component
public class JwtAuthTokenFilter extends OncePerRequestFilter{
... some code ...

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        logger.info("Firing JWT Token Filter.");

        String authHeader = request.getHeader(this.prop.getHeader());
        String authToken = null;
        String username = null;
        Date expiry = null; 
        Collection<? extends GrantedAuthority> authorities = null;;
        //if (requestHeader != null && requestHeader.startsWith("Bearer ")) {
        if (authHeader != null && authHeader.startsWith(bearer)) {
            authToken = authHeader.substring(bearer.length());

            try {
                logger.info("Token: {}",authToken);
                username = jwtUtil.getUsernameFromToken(authToken);
                authorities = AuthorityUtils.createAuthorityList(jwtUtil.getAudienceFromToken(authToken));
                logger.info("Username: {}", username);
                logger.info("Roles: {}", authorities);
                logger.info("Issue At: {}", jwtUtil.getIssuedAtDateFromToken(authToken));
                logger.info("Expiration: {}", jwtUtil.getExpirationDateFromToken(authToken));

            } catch (IllegalArgumentException e) {
                logger.error("Error Occurred {}", e);
            } catch (ExpiredJwtException e) {
                logger.warn("Token Expired! {}", e);
            }

            if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
                logger.info("authorizingi user!!!");

                UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(username, null, authorities);
                auth.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                logger.info("{} is authorized", username);
                SecurityContextHolder.getContext().setAuthentication(auth);
            }

        }else {
            logger.info("No header, ignoring");
        }

        filterChain.doFilter(request, response);
        logger.info("Closing JWT TOken Filter.");
    }
... some code ...
}

Вышеупомянутый фильтр в общих чертах основан на прочитанном мной руководстве по аутентификации токенов JWT. Кредиты парню. В настоящее время я занимаюсь конфигурацией java @Secured для защиты всех моих конечных точек REST-API. Я не буду выполнять настройку ролей пользователей в веб-конфигурации из-за части удобства обслуживания, которую вы должны определить в antMatchers. Поэтому я буду реализовывать @Secured на всех конечных точках REST-API. Однако я не могу авторизовать пользователя (в токене JWT) во всех моих конечных точках REST-API.

Как настроить авторизацию, чтобы @Secured мог ее распознать?

codereview.stackexchange.com/questions/197973/… (не совсем то, что вы спрашиваете, может быть полезно)
benjamin c 08.09.2018 12:17

Ох, понятно, спасибо, я понял основную идею, но по мере возможности я буду использовать то, что весной. Последнее средство - создать что-то вроде того, что вы мне сказали. Я еще не знаком со всем функционалом Spring. Может быть, здесь вам поможет тот, кто имеет многолетний опыт работы с весной. Спасибо!

lemoncodes 08.09.2018 12:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
116
0

Другие вопросы по теме