Можем ли мы загрузить другую конфигурацию безопасности на основе Mediatype, т.е. одну для REST и одну для Интернета? - PullRequest
1 голос
/ 09 июля 2020

Я разработал обычное приложение spring mvc и хочу добавить некоторый контроллер отдыха для разработки мобильного приложения. Я написал контроллер отдыха и конфигурации безопасности с несколькими пружинами.

Проблема в том, что они имеют приоритет, поэтому оба загружаются сразу, и все приложение выходит из строя. Я хочу использовать один в зависимости от типа запроса он получает, например, если я запрашиваю у почтальона, конфигурация безопасности Rest API должна работать, а если мы используем Интернет, конфигурация веб-безопасности должна работать.

Вот моя реализация, я не знаю, как Для этого предложите, пожалуйста, как это сделать правильно. Поскольку разделение всего Thymeleaf и MVC контроллера и перемещение вместе с Angular невозможно на данном этапе.

Обратите внимание, что у нас все остальные api определены в / v1 / ap1 / ** и вся остальная часть mvc находится в / **

Любые комментарии, предложения были бы очень признательны, это убивает мои дни с 3 дней. Заранее спасибо

@Configuration
@EnableWebSecurity
public class SecurityConfig {
     // ... other codes
     @Configuration
     @Order(1)
     public static class RestAPISecurity extends WebSecurityConfigurerAdapter {
       //.. other codes
       protected void configure(HttpSecurity http) throws Exception {
        http
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers("/api/signin/**").permitAll()
                .antMatchers("/api/v1/**").hasAnyAuthority("ADMIN", "USER")
                .antMatchers("/api/users/**").hasAuthority("ADMIN")
                .antMatchers("/api/v1/**").authenticated()
                .antMatchers("/login", "/logout", "/register", "/j_spring_security_check").permitAll()
                .anyRequest().authenticated()
                .and().exceptionHandling().authenticationEntryPoint(customAuthenticationEntryPoint).accessDeniedHandler(new CustomAccessDeniedHandler());
    }
// .. other codes
    @Configuration
    @Order(2)
    public static class MVCSecurityConfiguration extends WebSecurityConfigurerAdapter {
        //.. other codes
        // form login and other MVC stuffs
    }
}

1 Ответ

1 голос
/ 09 июля 2020

Вы можете добавить сопоставитель запросов для первой цепочки пружинных фильтров безопасности, а все остальное перейдет во вторую цепочку

    protected void configure(HttpSecurity http) throws Exception {
        http.requestMatcher(httpServletRequest -> {
              String userAgent = httpServletRequest.getHeader("User-Agent");      
              //If you want to check based on content type
              String contentType = httpServletRequest.getContentType();

              return userAgent.contains("....")
              //check what value postman sends as user agent and use it
            })
            .sessionManagement()
            ....
    }
...