如何为多个servlet配置弹簧安全性?

时间:2014-12-19 17:40:08

标签: java spring spring-mvc spring-security

我想在spring mvc应用程序中使用spring security,它由两个模块组成 - 一个“前端”和一个管理模块。两个模块都有自己的调度程序servlet(具有不同的映射),因此它们拥有自己的Web上下文,但共享相同的根上下文。

管理模块有自己的身份验证数据库,用户应该能够使用不同的凭据同时登录“前端”和管理模块。因此,我实现了两个不同的UserDetailsService s。

我需要两个不同的AuthenticationManager,其中两个都负责不同的URL,对应于servlet映射。

如何配置此类设置?是否可以使用java配置?

编辑:到目前为止,我有以下配置,允许我授权管理模块的用户。使用自动装配frontendUserDetailsService的“前端”模块身份验证/授权仍然缺失。

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private PasswordEncoder passwordEncoder;
    @Autowired
    @Qualifier("frontend")
    private UserDetailsService frontendUserDetailsService;
    @Autowired
    @Qualifier("management")
    private UserDetailsService managementUserDetailsService;

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .userDetailsService(managementUserDetailsService)
                .passwordEncoder(passwordEncoder);
    }

    @Bean
    @Qualifier("management")
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .antMatcher("/manage/**")
            .authorizeRequests()
                .anyRequest()
                .hasRole("ADMIN")
                .and()
            .formLogin();
    }
}

1 个答案:

答案 0 :(得分:5)

您应该创建执行某些操作的配置

  1. 启用安全性
  2. 启用前端的安全性
  3. 启用后端安全性
  4. 基本上,这些是配置的3个不同部分,它们都需要各自的@Configuration类。

    以下内容应该有效。

    @Configuration
    @EnableWebMvcSecurity
    public class SecurityConfig {
    
        @Configuration
        @Order(1)
        public static class FrontEndSecurityConfiguration extends WebSecurityConfigurerAdapter {
    
            @Autowired
            private PasswordEncoder passwordEncoder;
    
            @Autowired
            @Qualifier("frontend")
            private UserDetailsService frontendUserDetailsService;
    
            @Override
            public void configure(AuthenticationManagerBuilder auth) throws Exception {
                auth
                    .userDetailsService(frontendUserDetailsService)
                        .passwordEncoder(passwordEncoder);
            }
    
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http
                    .antMatcher("/frontend/**")
                    .authorizeRequests()
                        .anyRequest()
                        .hasRole("USER")
                        .and()
                    .formLogin();
            }
        }
    
        @Configuration
        @Order(2)
        public static class BackendSecurityConfiguration extends WebSecurityConfigurerAdapter {
    
            @Autowired
            private PasswordEncoder passwordEncoder;
    
            @Autowired
            @Qualifier("management")
            private UserDetailsService managementUserDetailsService;
    
            @Override
            public void configure(AuthenticationManagerBuilder auth) throws Exception {
                auth
                    .userDetailsService(managementUserDetailsService)
                        .passwordEncoder(passwordEncoder);
            }
    
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http
                    .antMatcher("/manage/**")
                    .authorizeRequests()
                        .anyRequest()
                        .hasRole("ADMIN")
                        .and()
                    .formLogin();
            }
        }
    }
    

    您可能需要调整