Size: a a a

Spring Framework and more

2020 June 18

C

Captcha bot in Spring Framework and more
Катенька ❤️, если ты не бот, нажми "семь". Ботов удалено: 9.
источник

AL

Aleksander Lemyagov in Spring Framework and more
Привет. Столкнулся с проблемой. Есть публичный url - /api/v1/common. Но спринг все равно пытается провести авторизацию через фильтр.

Конфиг:

http.authorizeRequests()
              .requestMatchers(PUBLIC_URLS)
              .permitAll();

      http
              .sessionManagement()
              .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
              .and()
              .exceptionHandling()
              .authenticationEntryPoint(this.authenticationEntryPoint)
              .and()
              .addFilterBefore(this.jwtRequestFilter, UsernamePasswordAuthenticationFilter.class)
              .authorizeRequests()
              .requestMatchers(PROTECTED_URLS)
              .authenticated();
источник

AL

Aleksander Lemyagov in Spring Framework and more
public void configure(WebSecurity web) не помогает тоже. Не понимаю в чем беда.
источник

k

kuzznya in Spring Framework and more
Возможно, стоит authorize requests делать в одном месте?
источник

k

kuzznya in Spring Framework and more
Я не очень разбираюсь, но в проектах везде видел сначала authenticated()
А потом permitAll()
источник

AL

Aleksander Lemyagov in Spring Framework and more
Не работает:

http
               .sessionManagement()
               .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
               .and()
               .exceptionHandling()
               .authenticationEntryPoint(this.authenticationEntryPoint)
               .and()
               .addFilterBefore(this.jwtRequestFilter, UsernamePasswordAuthenticationFilter.class)
               .authorizeRequests()
               .requestMatchers(PROTECTED_URLS)
               .authenticated()
               .and()
               .authorizeRequests()
               .requestMatchers(PUBLIC_URLS)
               .permitAll();
источник

k

kuzznya in Spring Framework and more
PUBLIC_URLS точно корректный?
источник

AL

Aleksander Lemyagov in Spring Framework and more
kuzznya
PUBLIC_URLS точно корректный?
new OrRequestMatcher(
           new AntPathRequestMatcher("/"),
           new AntPathRequestMatcher("/index"),
           new AntPathRequestMatcher("/public/**"),
           new AntPathRequestMatcher("/static/**"),
           new AntPathRequestMatcher("/webjars/**"),
           new AntPathRequestMatcher("/index.html"),
           new AntPathRequestMatcher("/resource/**"),
           new AntPathRequestMatcher("/favicon.ico"),
           new AntPathRequestMatcher("/actuator/**"),
           new AntPathRequestMatcher("/h2-console/**"),
           new AntPathRequestMatcher("/v2/api-docs"),
           new AntPathRequestMatcher("/v2/api-docs/**"),
           new AntPathRequestMatcher("/swagger-resources/**"),
           new AntPathRequestMatcher("/swagger-ui.html"),
           new AntPathRequestMatcher("/manifest.json"),
           new AntPathRequestMatcher("/**/favicon.ico"),
           new AntPathRequestMatcher("/api/v1/auth/**"),
           new AntPathRequestMatcher("/api/v1/admin/**"),
           new AntPathRequestMatcher("/api/v1/common"),
           new AntPathRequestMatcher("/api/v1/common/**"),
           new AntPathRequestMatcher("/api/v1/confirmation/**"),
           new AntPathRequestMatcher("/websocket/**")
   );
источник

Y

Youdgin in Spring Framework and more
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Aleksander Lemyagov
Привет. Столкнулся с проблемой. Есть публичный url - /api/v1/common. Но спринг все равно пытается провести авторизацию через фильтр.

Конфиг:

http.authorizeRequests()
              .requestMatchers(PUBLIC_URLS)
              .permitAll();

      http
              .sessionManagement()
              .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
              .and()
              .exceptionHandling()
              .authenticationEntryPoint(this.authenticationEntryPoint)
              .and()
              .addFilterBefore(this.jwtRequestFilter, UsernamePasswordAuthenticationFilter.class)
              .authorizeRequests()
              .requestMatchers(PROTECTED_URLS)
              .authenticated();
Так после authorizeRequests() вы настраиваете авторизацию, а не аутентификацию
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Она никак не влияет на то, пройдет ли запрос через фильтры
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Она влияет лишь на то, пускать ли юзера (которого уже удалось аутентифицировать, либо анонимуса, если все фильтры сказали "я не знаю кто это") в те УРЛы, которые вы указали
источник

Y

Youdgin in Spring Framework and more
Aleksander Lemyagov
Привет. Столкнулся с проблемой. Есть публичный url - /api/v1/common. Но спринг все равно пытается провести авторизацию через фильтр.

Конфиг:

http.authorizeRequests()
              .requestMatchers(PUBLIC_URLS)
              .permitAll();

      http
              .sessionManagement()
              .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
              .and()
              .exceptionHandling()
              .authenticationEntryPoint(this.authenticationEntryPoint)
              .and()
              .addFilterBefore(this.jwtRequestFilter, UsernamePasswordAuthenticationFilter.class)
              .authorizeRequests()
              .requestMatchers(PROTECTED_URLS)
              .authenticated();
Покажи фильтр как выглядит
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Тобишь, ваш запрос в любом случае пройдет через ваш jwtRequestFilter фильтр.
Но это не должно быть проблемой. Этот фильтр должен просто ничего не делать, если нет соответствующего хидера в запросе.

Посмотрите, например, имплементацию
org.springframework.security.web.authentication.www.BasicAuthenticationFilter
источник

AL

Aleksander Lemyagov in Spring Framework and more
Ruslan Stelmachenko
Тобишь, ваш запрос в любом случае пройдет через ваш jwtRequestFilter фильтр.
Но это не должно быть проблемой. Этот фильтр должен просто ничего не делать, если нет соответствующего хидера в запросе.

Посмотрите, например, имплементацию
org.springframework.security.web.authentication.www.BasicAuthenticationFilter
это магия, но проблема появилась после коммита одного и до этого он не вызывается если url находится в permitAll.
источник

AL

Aleksander Lemyagov in Spring Framework and more
фильтр не должен быть компонентом?
источник

RS

Ruslan Stelmachenko in Spring Framework and more
без разницы, вы же инстанс передаете
источник

AL

Aleksander Lemyagov in Spring Framework and more
Youdgin
Покажи фильтр как выглядит
@Component
@RequiredArgsConstructor
public class JwtRequestFilter extends OncePerRequestFilter {

   private final UserPrincipalServiceImpl userDetailsService;

   private final AuthenticationConfiguration authenticationConfiguration;

   @Override
   protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {

       String token = this.authenticationConfiguration.resolveToken(request);

       if (this.authenticationConfiguration.validateToken(token)&& SecurityContextHolder.getContext().getAuthentication() == null) {

           Claims tokenBody = this.authenticationConfiguration.getTokenBody(token);

           UserDetails userDetails = this.userDetailsService.loadUserByUsername(tokenBody.get("email", String.class));

           UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());

           usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));

           SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);

       }

       chain.doFilter(request, response);

   }

}
источник

AL

Aleksander Lemyagov in Spring Framework and more
Ruslan Stelmachenko
без разницы, вы же инстанс передаете
штука в том что фильтр отрабатывает даже если я убираю эту строку с конфигурации: .addFilterBefore(this.jwtRequestFilter, UsernamePasswordAuthenticationFilter.class)
источник

RS

Ruslan Stelmachenko in Spring Framework and more
А, ну вроде бы бут сам добавляет все бины, имплементящие сервлет-фильтр
источник