2015-12-09 20 views
5

Próbuję uzyskać aplikację mcc z wiosennym bootowaniem działającą ze standardowym loginem, jednocześnie eksponując niektóre punkty końcowe API z zabezpieczeniami oAuth2. Zasadniczo moje wymagania są następujące:Wiosenne uruchamianie: Zabezpieczanie punktu końcowego api za pomocą oauth2, mając jednocześnie strony interfejsu MVC

Jeśli użytkownik trafi na stronę główną ("/"), sprawdź, czy jest uwierzytelniony. Jeśli nie pokazujesz formularza logowania, w przeciwnym razie wyświetl stronę główną. Ale użytkownik powinien również być w stanie poprosić o token uwierzytelniania oauth iz tym tokenem acces/api/assign/{id}.

Mogę uzyskać standardowy login do pracy i mogę uruchomić oauth2, ale nie mogę ich zmusić do współpracy.

To jest moja konfiguracja w tej chwili:

WebSecurityConfig

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    @Autowired 
    private DataSource dataSource; 

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

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     super.configure(http);   
    } 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {  
     auth.jdbcAuthentication().dataSource(this.dataSource).passwordEncoder(new BCryptPasswordEncoder()); 
    } 
} 

OAuth2Config

@Configuration 
@EnableResourceServer 
@EnableAuthorizationServer 
public class OAuth2Config { 

protected static final String RESOURCE_ID = "oauthdemo"; 

@Configuration 
@EnableResourceServer 
protected static class ResourceServer extends ResourceServerConfigurerAdapter { 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http   
     .httpBasic().disable() 
     .authorizeRequests() 
     .antMatchers("/js/**", "/css/**", "/images/**", "/webjars/**", "/login").permitAll() 
      .anyRequest().authenticated() 
      .and() 
     .formLogin() 
      .loginPage("/login") 
      .permitAll() 
      .and() 
     .logout() 
      .permitAll(); 

    } 

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


@Configuration 
@EnableAuthorizationServer 
protected static class AuthServer extends AuthorizationServerConfigurerAdapter { 

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

    @Override 
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception { 
     oauthServer.allowFormAuthenticationForClients(); 
    } 

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

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     clients.inMemory() 
       .withClient("client") 
       .authorizedGrantTypes("password", "refresh_token") 
       .authorities("ROLE_USER") 
       .scopes("read") 
       .resourceIds(RESOURCE_ID) 
       .secret("secret").accessTokenValiditySeconds(3600); 
    } 

} 

}

proble m jest zawsze pojawia się następujący błąd, gdy próbuje otworzyć stronę główną („/”)

<oauth> 
<error_description> 
Full authentication is required to access this resource 
</error_description> 
<error>unauthorized</error> 
</oauth> 

To nie przekierowuje do strony logowania. Nie potrzebuję tej strony do ochrony przez oauth2, ale nawet jeśli przejdę bezpośrednio do strony logowania ("/ login", do której mogę uzyskać dostęp) i poświadczenia dostaw nadal otrzymuję komunikat o błędzie "pełna autoryzacja jest wymagana". Mimo że wyłączono podstawowe uwierzytelnianie http.

Czy ktoś wie, jak oddzielić zwykły interfejs użytkownika od punktów końcowych API, które muszą być chronione przez OAuth2?

+0

Czy uda Ci się rozwiązać ten problem? –

+0

Myślę, że w twoim WebSecurityConfig brakuje "zignoruj ​​wszystkie adresy URL, które chcę zabezpieczyć używając oauth". Może coś takiego można wykorzystać ...: http://stackoverflow.com/questions/30366405/how-to-disable-spring-security-for-particular-url –

Odpowiedz

2

możesz spróbować tej

http   
     .authorizeRequests() 
     .antMatchers("/js/**", "/css/**", "/images/**", "/webjars/**", "/login").permitAll() 
     .antMatchers("/login").permitAll() 
     .antMatchers("/home").authenticated(); 

Zważywszy/home to strona, która musi zostać zatwierdzona.

+0

Dzięki za sugestię, ale to tylko autoryzuje stronę główną, która ma ten sam komunikat o błędzie, a teraz strona główna ("/") jest nieuwierzytelniona –

1

Hi trzeba określić filtry stosowane dla każdego config w Twoim przypadku musisz:

w internetowej configurtion bezpieczeństwa

 http 
     .authorizeRequests() 
      .antMatchers("/api/**","/oauth/**") 
      .permitAll() 
      .and() 
      ....... 

ten pozwoli serwerów autoryzacji bypass security web/zasobów adresy URL

oraz w konfiguracji zabezpieczeń serwera zasobów:

 http 
     .antMatcher("/api/**") 
      .authorizeRequests() 
      .anyRequest() 
      .authenticated(); 

pozwoli to bezpieczeństwu zasobów omijać wszystkie adresy URL za wyjątkiem "/ api/**".

w ten sposób można zignorować polecenia konfiguracji nie ma innej opcji przez Wykonaj jedno z powyższych działań i umieścić swoją konfigurację w celu wczesnego wykorzystaniem @Order