Несколько конфигураций безопасности для указанных конечных точек c - PullRequest
1 голос
/ 21 февраля 2020

Мне интересно, есть ли способ обеспечить два отдельных типа аутентификации? Пользователь должен войти, зарегистрироваться, получить пользовательские данные для конечных точек /login, /register, /user, используя basi c auth. И когда я звоню /api, он должен быть аутентифицирован только с помощью токена JWT , указанного в заголовках.

Но когда я звоню /api, я получаю все данные без какой-либо аутентификации. Когда пользователь входит в систему и вызывает /user, API дает JWT доступ к /api.

Мой код:

Конфигурация для basi c auth:

@Configuration
@EnableWebSecurity
@Order(1)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .cors()
                .and()
            .csrf().disable();
        http
            .authorizeRequests()
                .antMatchers("/user").authenticated()
                .antMatchers("/register").permitAll()
                .and()
            .formLogin().permitAll()
                .defaultSuccessUrl("/user");
    }

Конфигурация для аутентификации JWT:

@Configuration
@Order(2)
public class JWTSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .antMatcher("/api/**")
            .addFilterAfter(new JWTAuthorizationFilter(),UsernamePasswordAuthenticationFilter.class)
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .httpBasic().disable();
    }

1 Ответ

0 голосов
/ 22 февраля 2020

У меня была та же проблема, я хотел базовую c аутентификацию для некоторых конечных точек, а для некоторых других я хотел другие методы аутентификации. как твой. вы хотите базовую c аутентификацию для некоторых конечных точек (/login, /register, /user) и JWT-аутентификацию для некоторых других (/api/**).

Я использовал несколько руководств по нескольким точкам входа в Spring Security , но это не сработало.

Так вот мое решение (Работало)

Отдельная базовая c аутентификация из JWT аутентификация путем создания пользовательского фильтра.

  1. Добавьте префиксный путь для конечных точек, которые должны проходить аутентификацию с использованием базовой аутентификации 1047 *. например: (/basic/login, /basic/register, /basic/user)

  2. Создать новый пользовательский фильтр для префикса /basic (для запросов /basic) и проверить basi c аутентификация

    @Component
    public class BasicAuthenticationFilter implements Filter {
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    
        //Check for the requests that starts with /basic 
        if (httpServletRequest.getRequestURI().startsWith("/basic/")) {
    
            try {
                //Fetch Credential from authorization header
                String authorization = httpServletRequest.getHeader("Authorization");
                String base64Credentials = authorization.substring("Basic".length()).trim();
                byte[] credDecoded = Base64.getDecoder().decode(base64Credentials);
                String credentials = new String(credDecoded, StandardCharsets.UTF_8);
                final String username = credentials.split(":", 2)[0];
                final String password = credentials.split(":", 2)[1];
    
                //Check the username and password
                if (username.equals("admin") && password.equals("admin")) {
                    //continue
                    chain.doFilter(request, response);
                } else
                    throw new AuthenticationCredentialsNotFoundException("");
            } catch (Exception e) {
                throw new AuthenticationCredentialsNotFoundException("");
            }
    
        } else chain.doFilter(request, response);
    
      }
    
    }
    
  3. Написать основную конфигурацию безопасности только для JWT и разрешить /basic URL

    @Configuration
    @EnableWebSecurity
    public class JWTSecurityConfig extends WebSecurityConfigurerAdapter {
    
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/basic/**").permitAll().and()
                .csrf().disable()
                .antMatcher("/api/**")
                .addFilterAfter(new JWTAuthorizationFilter(),UsernamePasswordAuthenticationFilter.class)
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .httpBasic().disable();
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...