Spring Boot:在同一个项目中验证无状态REST API和状态“登录”Web控制器?

时间:2018-02-21 11:02:11

标签: spring spring-boot spring-security

所以我有一个包含REST API的应用程序,它由IOT设备上的自定义Java应用程序使用,没有用户交互。我还有一个Web应用程序,需要有状态会话来维护用户登录。

是否可以使用Spring Security对我的API和Web控制器的请求进行不同的身份验证?我应该使用什么形式的身份验证进行REST API?

1 个答案:

答案 0 :(得分:5)

实现目标的一种方法是在弹簧安全性中使用2种配置。 E.g。

请注意antMatcher匹配而非匹配 s )。 antMatcher将控制整个配置应用的网址集,例如下面示例中的FormLoginWebSecurityConfigurerAdapter仅适用于匹配/api/test/**的uri。当然,你只能在其中一个配置中定义antMatcher说config1,在这种情况下另一个配置将是一个全部捕获(即捕获与config1不匹配的所有内容)

@EnableWebSecurity
@Configuration
public class SecurityConfig {


    @Configuration
    @Order(1)                                                        
    public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {

        @Override       
        public void configure(AuthenticationManagerBuilder auth) 
          throws Exception {            
            auth.inMemoryAuthentication().withUser("user").password("user").roles("USER");
            auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN");
        }

        protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)

            http
                .antMatcher("/api/v1/**")                               
                .authorizeRequests()
                .antMatchers("/api/v1/**").authenticated()
                    .and()
                .httpBasic();
        }
    }

    @Configuration
    @Order(2)
    public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

        @Override       
        public void configure(AuthenticationManagerBuilder auth) 
          throws Exception {

            auth.inMemoryAuthentication().withUser("user1").password("user").roles("USER");
            auth.inMemoryAuthentication().withUser("admin1").password("admin").roles("ADMIN");
        }

        @Override
        protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED); // CONFIGURE TYPE OF SESSION POLICY
            http
                .antMatcher("/api/test/**")
                .authorizeRequests()
                .antMatchers("/api/test/**").authenticated()
                    .and()
                .formLogin();
        }
    }
}