2015-03-06 2 views
15

Мой проект состоит из двух разных частей: панели администрирования JSF и службы RESTfull. Я пытаюсь настроить весеннюю безопасность для использования разных методов проверки подлинности в зависимости от URL-адреса, который пользователь просматривает.Весна безопасности oauth2 и форма конфигурации входа

Требования

  • Пользователи Переход на страницу JSF получить экран входа в систему, где они аутентификации с использованием проверки подлинности форм.
  • Пользователи, проводящие службу REST, используют неявную аутентификацию OAuth2 с базовой аутентификацией для предоставления маркера.

отдельная конфигурация работы сами по себе, проблема в том, когда я пытаюсь объединить оба в одной конфигурации, в этом случае, похоже, как поставщик REST получает в пути и проверяет подлинность каждого запроса, даже если запросы идут к URL-адресу администратора (это описано с помощью весеннего заказа безопасности).

Мои конфигурации выборки, как показано ниже:

  • для формы входа в систему (JSF)

    @Override 
    @Order(1) 
    protected void configure(HttpSecurity http) throws Exception { 
    http 
         .csrf().disable() 
         .authorizeRequests() 
         .antMatchers("/resources/**").permitAll() 
         .antMatchers("/templates/**").permitAll() 
         .antMatchers("/401.html").permitAll() 
         .antMatchers("/404.html").permitAll() 
         .antMatchers("/500.html").permitAll() 
         .antMatchers("/api/**").permitAll() 
         .antMatchers("/ui/admin.xhtml").hasAnyAuthority("admin", "ADMIN") 
         .antMatchers("/thymeleaf").hasAnyAuthority("admin", "ADMIN") 
         //.anyRequest().authenticated() 
         .and() 
         .formLogin() 
         .loginPage("/login") 
         .defaultSuccessUrl("/ui/index.xhtml") 
         .failureUrl("/login?error=1") 
         .permitAll() 
         .and() 
         .logout() 
         .permitAll() 
         .and() 
         .rememberMe() 
         .and().exceptionHandling().accessDeniedPage("/error/403"); 
    
  • OAuth2 безопасности конфигурации (REST) ​​

    @EnableResourceServer 
    @Order(2) 
    public class RestSecurityConfig extends WebSecurityConfigurerAdapter { 
    
        @Inject 
        private UserRepository userRepository; 
    
        @Inject 
        private PasswordEncoder passwordEncoder; 
    
        @Bean 
        ApplicationListener<AbstractAuthorizationEvent> loggerBean() { 
         return new AuthenticationLoggerListener(); 
        } 
    
        @Bean 
        AccessDeniedHandler accessDeniedHandler() { 
         return new AccessDeniedExceptionHandler(); 
        } 
    
        @Bean 
        AuthenticationEntryPoint entryPointBean() { 
         return new UnauthorizedEntryPoint(); 
        } 
    
        /*Override 
        public void configure(WebSecurity web) throws Exception { 
         web.ignoring() 
           .antMatchers(
             "/resources/**" 
             , "/templates/**" 
             , "/login" 
             , "/logout" 
             , "/ui/**" 
             , "/401.html" 
             , "/404.html" 
             , "/500.html" 
           ); 
        }*/ 
    
        @Override 
        protected void configure(HttpSecurity http) throws Exception { 
         ContentNegotiationStrategy contentNegotiationStrategy = http.getSharedObject(ContentNegotiationStrategy.class); 
         if (contentNegotiationStrategy == null) { 
          contentNegotiationStrategy = new HeaderContentNegotiationStrategy(); 
         } 
         MediaTypeRequestMatcher preferredMatcher = new MediaTypeRequestMatcher(contentNegotiationStrategy, 
           MediaType.APPLICATION_FORM_URLENCODED, 
           MediaType.APPLICATION_JSON, 
           MediaType.MULTIPART_FORM_DATA); 
    
         http.authorizeRequests() 
           .antMatchers("/ui/**").permitAll() 
           .and() 
           .anonymous().disable() 
           .sessionManagement() 
           .sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
           .and().httpBasic() 
           .and() 
           .exceptionHandling() 
           .accessDeniedHandler(accessDeniedHandler()) // handle access denied in general (for example comming from @PreAuthorization 
           .authenticationEntryPoint(entryPointBean()) // handle authentication exceptions for unauthorized calls. 
           .defaultAuthenticationEntryPointFor(entryPointBean(), preferredMatcher) 
           .and() 
           .authorizeRequests() 
           .antMatchers("/api/**").fullyAuthenticated(); 
    
        } 
    
        @Override 
        @Bean 
        public AuthenticationManager authenticationManagerBean() throws Exception { 
         return super.authenticationManagerBean(); 
        } 
    
        @Override 
        protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
         auth.userDetailsService(new UserDetailsService() { 
          @Override 
          public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { 
           User user = userRepository.findOneByUsername(s); 
    
           if (null == user) { 
            // leave that to be handled by log listener 
            throw new UsernameNotFoundException("The user with email " + s + " was not found"); 
           } 
    
           return (UserDetails) user; 
          } 
         }).passwordEncoder(passwordEncoder); 
        } 
    
    
        @Configuration 
        @EnableAuthorizationServer 
        protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter { 
    
    
    
         @Autowired 
         private AuthenticationManager authenticationManager; 
    
    
         @Bean 
         public JwtAccessTokenConverter accessTokenConverter() { 
          return new JwtAccessTokenConverter(); 
         } 
    
         @Override 
         public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception { 
          oauthServer.tokenKeyAccess("isAnonymous() || hasAuthority('ROLE_TRUSTED_CLIENT')").checkTokenAccess("hasAuthority('ROLE_TRUSTED_CLIENT')"); 
         } 
    
         @Override 
         public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
          endpoints.authenticationManager(authenticationManager).accessTokenConverter(accessTokenConverter()); 
         } 
    
    
         @Override 
         public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
          clients.inMemory() 
            .withClient("xxx") 
            .resourceIds(xxx) 
            .authorizedGrantTypes("password", "authorization_code", "refresh_token", "implicit") 
            .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT") 
            .scopes("read", "write", "trust", "update") 
            .accessTokenValiditySeconds(xxx) 
            .refreshTokenValiditySeconds(xxx) 
            .secret("xxx") 
    
         } 
        } 
    } 
    

Эти конфигурации существуют на и классы упорядочиваются вручную.

Есть ли какие-либо решения этой проблемы?

Best,

+0

Вы были в состоянии решить эту проблему? Можете ли вы отправить ответ, пожалуйста. –

+0

@Maleenc, к сожалению, нет, я бы очень признателен и ответил от парней безопасности Spring. – maxsap

ответ

16

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

Может быть, это может помочь вам:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private UserRepository userRepository; 

    @Autowired 
    private PasswordEncoder passwordEncoder; 

    @Autowired 
    protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(new UserDetailsService() { 
      @Override 
      public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { 
       User user = userRepository.findOneByUsername(s); 

       if (null == user) { 
        throw new UsernameNotFoundException("The user with email " + s + " was not found"); 
       } 

       return (UserDetails) user; 
      } 
     }).passwordEncoder(passwordEncoder); 
    } 

    @Override 
    public void configure(WebSecurity webSecurity) throws Exception { 
     webSecurity 
       .ignoring() 
       .antMatchers("/resources/**" 
         , "/templates/**" 
         , "/login" 
         , "/logout" 
         , "/ui/**" 
         , "/401.html" 
         , "/404.html" 
         , "/500.html"); 
    } 

    @Configuration 
    @EnableAuthorizationServer 
    public static class OAuth2Configuration extends AuthorizationServerConfigurerAdapter { 

     @Autowired 
     private AuthenticationManager authenticationManager; 

     @Bean 
     public JwtAccessTokenConverter accessTokenConverter() { 
      return new JwtAccessTokenConverter(); 
     } 

     @Override 
     public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception { 
      oauthServer.tokenKeyAccess("isAnonymous() || hasAuthority('ROLE_TRUSTED_CLIENT')").checkTokenAccess("hasAuthority('ROLE_TRUSTED_CLIENT')"); 
     } 

     @Override 
     public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
      endpoints.authenticationManager(authenticationManager).accessTokenConverter(accessTokenConverter()); 
     } 


     @Override 
     public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
      clients.inMemory() 
        .withClient("xxx") 
        .resourceIds("xxx") 
        .authorizedGrantTypes("password", "authorization_code", "refresh_token", "implicit") 
        .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT") 
        .scopes("read", "write", "trust", "update") 
        .accessTokenValiditySeconds(xxx) 
        .refreshTokenValiditySeconds(xxx) 
        .secret("xxx"); 

     } 
    } 

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

     @Override 
     public void configure(HttpSecurity http) throws Exception { 
      http 
        .csrf().disable() 
        .authorizeRequests() 
        .antMatchers("/ui/admin.xhtml").hasAnyAuthority("admin", "ADMIN") 
        .antMatchers("/thymeleaf").hasAnyAuthority("admin", "ADMIN") 
        .and() 
        .formLogin() 
        .loginPage("/login") 
        .defaultSuccessUrl("/ui/index.xhtml") 
        .failureUrl("/login?error=1") 
        .permitAll() 
        .and() 
        .logout() 
        .permitAll() 
        .and() 
        .rememberMe() 
        .and().exceptionHandling().accessDeniedPage("/error/403"); 
     } 
    } 

    @Order(2) 
    @Configuration 
    @EnableResourceServer 
    public static class CustomResourceServerConfigurerAdapter extends ResourceServerConfigurerAdapter { 

     @Bean 
     ApplicationListener<AbstractAuthorizationEvent> loggerBean() { 
      return new AuthenticationLoggerListener(); 
     } 

     @Bean 
     AccessDeniedHandler accessDeniedHandler() { 
      return new AccessDeniedExceptionHandler(); 
     } 

     @Bean 
     AuthenticationEntryPoint entryPointBean() { 
      return new UnauthorizedEntryPoint(); 
     } 

     @Override 
     public void configure(HttpSecurity http) throws Exception { 
      ContentNegotiationStrategy contentNegotiationStrategy = http.getSharedObject(ContentNegotiationStrategy.class); 
      if (contentNegotiationStrategy == null) { 
       contentNegotiationStrategy = new HeaderContentNegotiationStrategy(); 
      } 
      MediaTypeRequestMatcher preferredMatcher = new MediaTypeRequestMatcher(contentNegotiationStrategy, 
        MediaType.APPLICATION_FORM_URLENCODED, 
        MediaType.APPLICATION_JSON, 
        MediaType.MULTIPART_FORM_DATA); 

      http.authorizeRequests() 
        .and() 
        .anonymous().disable() 
        .sessionManagement() 
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
        .and().httpBasic() 
        .and() 
        .exceptionHandling() 
        .accessDeniedHandler(accessDeniedHandler()) // handle access denied in general (for example comming from @PreAuthorization 
        .authenticationEntryPoint(entryPointBean()) // handle authentication exceptions for unauthorized calls. 
        .defaultAuthenticationEntryPointFor(entryPointBean(), preferredMatcher) 
        .and() 
        .authorizeRequests() 
        .antMatchers("/api/**").fullyAuthenticated(); 
     } 
    } 
} 
+0

Могу ли я использовать formLogin с/** и использовать другую форму restLogin с/api/**? Не таможни собственной формы. Запишите, что вы делаете выше. – WhiteWater