2016-07-25 9 views
2

Webアプリケーションには、クライアントと翻訳者の2人のユーザーがいます。私はこれに対して2つの異なるHttpSecurity設定を作成しました。私は両方の構成のためのスーパークラスを持っている:Springセキュリティを使用して1つのアプリケーションで2つの別々のログインフォームを正しく設定する

@Configuration 
@EnableWebSecurity 
public class AppSecurityConfigGlobal{ 


    @Configuration 
    @Order(1) 
    public static class AppSecurityConfigTranslator extends AppSecurityConfig{ 

     @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      http 
        .antMatcher("/translator/**") 
        .authorizeRequests() 
        .antMatchers("/translator/registration*","/bulbular*").anonymous() 
        .antMatchers("/translator/index","/translator/login*").permitAll() 
        .antMatchers("/translator/**").hasRole("TRANSLATOR") 
        .anyRequest().authenticated() 
       .and() 
        .formLogin() 
        .loginPage("/translator/login") 
        .permitAll() 
        .successHandler(customSuccessHandler) 
        .failureUrl("/translator/login?error") 
        .usernameParameter("username") 
        .passwordParameter("password") 
        .loginProcessingUrl("/j_spring_security_check") 
       .and() 
         .logout().deleteCookies("JSESSIONID") 
           .logoutUrl("/translator/logout") 
           .logoutSuccessUrl("/translator/login?logout") 
       .and() 
        .rememberMe().tokenRepository(tokenRepository) 
        .tokenValiditySeconds(86400) 
       .and() 
        .csrf() 
       .and() 
        .exceptionHandling() 
        .accessDeniedHandler(accessDeniedHandler); 

     } 
    } 

    @Configuration 
    @Order(2) 
    public static class AppSecurityConfigClient extends AppSecurityConfig{ 
     @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      http  
        .authorizeRequests() 
        .antMatchers("/client/registration*","/bulbular*").anonymous() 
        .antMatchers("/client/**").hasRole("CLIENT") 
        .antMatchers("/admin/**").hasRole("ADMIN") 
        .antMatchers("/index","/translators","/orders","/client/login*").permitAll() 
       .and() 
        .formLogin() 
        .loginPage("/client/login") 
        .permitAll() 
        .successHandler(customSuccessHandler) 
        .failureUrl("/client/login?error") 
        .usernameParameter("username") 
        .passwordParameter("password") 
        .loginProcessingUrl("/j_spring_security_check") 
       .and() 
         .logout().deleteCookies("JSESSIONID") 
           .logoutUrl("/client/logout") 
           .logoutSuccessUrl("/client/login?logout") 
       .and() 
        .rememberMe().tokenRepository(tokenRepository) 
        .tokenValiditySeconds(86400) 
       .and() 
        .csrf() 
       .and() 
        .exceptionHandling() 
        .accessDeniedHandler(accessDeniedHandler); 
     } 
    } 
} 

ROLE_CLIENTを持つユーザがログアウトしたときに私の問題は、彼は../client/にリダイレクトされます。

@Configuration 
@ComponentScan(basePackages = {"ua.translate"}) 
public class AppSecurityConfig extends WebSecurityConfigurerAdapter { 
    @Autowired 
    CustomSuccessHandler customSuccessHandler; 

    @Autowired 
    @Qualifier("customAccessDeniedHandler") 
    AccessDeniedHandler accessDeniedHandler; 

    @Autowired 
    DataSource dataSource; 

    @Autowired 
    PersistentTokenRepository tokenRepository; 

    @Override 
    public void configure(WebSecurity web){ 
     web 
      .ignoring() 
      .antMatchers(new String[]{"/resources/**"}); 
    } 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth,@Qualifier("detailsService") UserDetailsService uds) throws Exception{ 
     auth.userDetailsService(uds) 
      .passwordEncoder(bcryptEncoder()); 

    } 

    @Bean 
    public PasswordEncoder bcryptEncoder(){ 
     return new BCryptPasswordEncoder(); 
    } 

    @Autowired 
    @Bean 
    public PersistentTokenBasedRememberMeServices getPersistentTokenBasedRememberMeServices(@Qualifier("detailsService") UserDetailsService uds) { 
     PersistentTokenBasedRememberMeServices tokenBasedservice = new PersistentTokenBasedRememberMeServices(
       "remember-me", uds, tokenRepository); 
     return tokenBasedservice; 
    } 


    @Bean 
    public SavedRequestAwareAuthenticationSuccessHandler 
       savedRequestAwareAuthenticationSuccessHandler() { 

       SavedRequestAwareAuthenticationSuccessHandler auth 
        = new SavedRequestAwareAuthenticationSuccessHandler(); 
     auth.setTargetUrlParameter("targetUrl"); 
     return auth; 
    } 


} 

異なるユーザのための2つの異なる構成があります。ログインに成功したことに関するメッセージは表示されません。

しかし、ROLE_TRANSLATORのユーザーがログアウトすると、../translator/login?logoutにリダイレクトされ、メッセージが表示されるため、問題はありません。

私は

答えて

0

が、私はこの問題の原因を見つけ、)、私を助けてください、この問題の原因を理解していません!クライアントのための私の構成では私が持っている:構成のandMatchers(..)の順序のための

.antMatchers("/client/registration*","/bulbular*").anonymous() 
        .antMatchers("/client/**").hasRole("CLIENT") 
        .antMatchers("/admin/**").hasRole("ADMIN") 
        .antMatchers("/index","/translators","/orders","/client/login*").permitAll() 

が、1つのルールは以下のとおりです。最も厳しいandMatchersは最後でなければなりません。

私は順序を変更:

.antMatchers("/client/registration*","/bulbular*").anonymous() 
        .antMatchers("/index","/translators","/orders","/client/login*").permitAll() 
        .antMatchers("/client/**").hasRole("CLIENT") 
        .antMatchers("/admin/**").hasRole("ADMIN") 

、問題が解決さ)

関連する問題