2016-03-21 14 views
0

Ich muss zusätzliche Einschränkung hinzufügen, um Benutzer zu authentifizieren. Mein Benutzermodell hat ein Feld 'aktiv'. Es ist falsch, wenn sich der Benutzer registriert, aber nicht seinen Account mit Hash von Mail aktiviert. Jetzt, selbst wenn der Benutzer nicht aktiv ist, erhält er access_token von Oauth. Wie soll ich das konfigurieren? Ich habe über SpringSecurityInterceptor nachgedacht, aber ich bin mir nicht sicher, ob ich Spring Security mit OAuth2 verwechseln könnte. Dies ist meine SpringOAuth2.0 Konfiguration:Frühling OAuth2 zusätzliche Permission

@Configuration 
public class OAuth2Configuration extends AuthorizationServerConfigurerAdapter { 

    private static final String RESOURCE_ID = "restservice"; 

@Configuration 
@EnableResourceServer 
protected static class ResourceServerConfiguration extends 
     ResourceServerConfigurerAdapter { 


    @Override 
    public void configure(ResourceServerSecurityConfigurer resources) { 
     resources 
       .resourceId(RESOURCE_ID); 
    } 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http 
       .requestMatcher(new OrRequestMatcher(
         new AntPathRequestMatcher("/rest/**") 
       )) 
       .authorizeRequests() 

       .anyRequest().access("#oauth2.hasScope('read')"); 
    } 

} 


@Configuration 
@EnableAuthorizationServer 
protected static class AuthorizationServerConfiguration extends 
     AuthorizationServerConfigurerAdapter { 

    private TokenStore tokenStore = new InMemoryTokenStore(); 

    @Autowired 
    @Qualifier("authenticationManagerBean") 
    private AuthenticationManager authenticationManager; 

    @Autowired 
    UserDetailsService userDetailsService; 

    @Override 
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) 
      throws Exception { 
     endpoints 
       .tokenStore(this.tokenStore) 
       .authenticationManager(this.authenticationManager) 
       .userDetailsService(userDetailsService) 
       .pathMapping("/oauth/token", "/rest/oauth/token"); 
    } 

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     clients 
       .inMemory() 
       .withClient("clientapp") 
       .authorizedGrantTypes("password", "authorization_code", "refresh_token", "implicit") 
       .authorities("USER") 
       .scopes("read", "write", "trust") 
       .resourceIds(RESOURCE_ID) 


        .secret("123456"); 
     } 

    } 

} 

und Frühling auch

@Configuration 
@Order(2147483640) 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    DataSource dataSource; 

    @Autowired 
    UserDetailsService userDetailsService; 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 

     http 
       .authorizeRequests() 
       .antMatchers("/user/**").authenticated() 
       .anyRequest().permitAll() 
       .and() 
       .formLogin() 
       .loginPage("/login") 
       .usernameParameter("email") 
       .passwordParameter("password") 
       .defaultSuccessUrl("/user/") 
       .successHandler(successHandler()) 
       .and() 
       .logout() 
       .logoutUrl("/logout") 
       .logoutSuccessUrl("/") 
       .and() 
       .rememberMe() 
       .tokenRepository(persistentTokenRepository()) 
       .tokenValiditySeconds(86400) 
       .and() 
       .csrf().disable(); 
    } 

    @Bean 
    public AuthenticationSuccessHandler successHandler() { 
     return new UserLoginSuccessHandler(); 
    } 

    @Bean 
    public PersistentTokenRepository persistentTokenRepository() { 
     JdbcTokenRepositoryImpl tokenRepositoryImpl = new JdbcTokenRepositoryImpl(); 
     tokenRepositoryImpl.setDataSource(dataSource); 
     return tokenRepositoryImpl; 
    } 

    @Bean 
    public SpringSecurityDialect securityDialect() { 
     return new SpringSecurityDialect(); 
    } 

    @Autowired 
    public void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(userDetailsService) 
       .passwordEncoder(new BCryptPasswordEncoder()); 
    } 

    @Override 
    @Bean 
    public AuthenticationManager authenticationManagerBean() throws Exception { 

     return super.authenticationManagerBean(); 
    } 
} 

Jede Beratung Sicherheit hilfreich sein würde.

Antwort

0

Wenn ich Sie richtig verstehe, möchten Sie nicht, dass Ihr Autorisierungsserver einem nicht aktivierten Benutzer ein Zugriffstoken gewährt.

Sie könnten Ihre UserDetailsService.loadUserByUsername eine UsernameNotFoundException werfen, wenn der Benutzer existiert, aber nicht aktiviert ist.

+0

Vielen Dank für Ihre Antwort, aber ich habe es bereits mit UserDetails-Schnittstelle getan. Jetzt implementiert meine Benutzereinheit diese Schnittstelle. Es gibt Methoden, die dafür zuständig sind, zu überprüfen, ob der Benutzer aktiv ist, sein Konto nicht abgelaufen ist usw. – rpieniazek

+0

Sie haben Recht, das ist viel besser! – Tom