Как игнорировать конечную точку в Spring Security? - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь реализовать JWT.У меня есть две конечные точки: /api/auth/signin для аутентификации, которая возвращает сгенерированный токен JWT и /api/auth/me, которая должна возвращать пользователя на основе токена JWT в заголовке.Я пытаюсь настроить Spring Security для доступа к /api** только авторизованным пользователям, и мне нужно исключить /api/auth/signin Вот метод configure() из класса, который расширяет WebSecurityConfigurerAdapter:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.antMatcher("/api**")
            .httpBasic().disable()
            .csrf().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .authorizeRequests()
                .antMatchers(HttpMethod.POST, "/api/auth/signin").permitAll()
                .anyRequest().authenticated()
            .and()
            .addFilterBefore(jwtAuthorizationFilter(), UsernamePasswordAuthenticationFilter.class);
}

Но он все еще вызывает JwtAuthorizationFilter для /api/auth/signin.Я также пытался игнорировать эту конечную точку с помощью:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers(HttpMethod.POST,"/api/auth/signin");
}

Есть ли другой способ игнорировать ее или, возможно, permitAll() и ignoring() следует использовать по-другому?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Почему бы не создать два типа конечных точек:

  1. авторизованные API: "/ api / auth / **"
  2. неавторизованные API: "/ api / noauth / **"

А затем настроить безопасность только для "/ api / auth / **"

0 голосов
/ 24 ноября 2018

Вам нужен фильтр AbstractAuthenticationProcessingFilter для генерации токена JWT в / api / auth / signin и GenericFilterBean для извлечения объекта аутентификации и помещения его в SecurityContextHolder

, есть хороший пример по следующей ссылке:

https://auth0.com/blog/securing-spring-boot-with-jwts/

http.antMatcher("/api**")
                .httpBasic().disable()
                .csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
            // We filter the api/login requests
            .addFilterBefore(new JWTLoginFilter("/api/auth/signin", authenticationManager()),
                    UsernamePasswordAuthenticationFilter.class)
            // And filter other requests to check the presence of JWT in header
            .addFilterBefore(new jwtAuthorizationFilter(),
                    UsernamePasswordAuthenticationFilter.class);

И я не уверен, возможно ли вернуть сгенерированный токен из successAuthentication () в JWTLoginFilter в теле ответа

образец возвращает токен в заголовке авторизации ответа.но если хочешь вернуть токен в тело.Вы можете использовать следующий код:

static void addAuthentication(HttpServletResponse res, String username) {
        String JWT = Jwts.builder()
                .setSubject(username)
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATIONTIME))
                .signWith(SignatureAlgorithm.HS512, SECRET)
                .compact();
//        res.addHeader(HEADER_STRING, TOKEN_PREFIX + " " + JWT);
        JSONObject tokenJson = new JSONObject();
        tokenJson.put(SecurityConstants.JWT_TOKEN, JWT);
        tokenJson.put(SecurityConstants.USERNAME, username);
        try(PrintWriter writer = res.getWriter()) {
            writer.print(tokenJson.toJSONString());
            writer.flush();
        } catch (IOException e) {
            LOG.error("error ...");
        }
//        res.addHeader(HEADER_STRING, TOKEN_PREFIX + " " + JWT);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...