2015-12-09 3 views
5

Ich versuche, eine Spring-Boot-MVC-Anwendung mit Standard-Login arbeiten, während einige API-Endpunkte mit oAuth2 Sicherheit ausgesetzt. Grundsätzlich sind meine Anforderungen wie folgt:Spring Boot: Sicherung von API-Endpunkt mit oauth2 während mvc UI-Seiten

Wenn ein Benutzer die Homepage ("/") trifft, überprüfen Sie, ob es authentifiziert ist. Wenn das Anmeldeformular nicht angezeigt wird, zeigen Sie andernfalls die Startseite an. Aber ein Benutzer sollte auch in der Lage sein, nach einem oauth-Authentifizierungs-Token und mit diesem Token acces/api/assignment/{id} zu fragen.

Ich kann den Standard-Login zu arbeiten, und ich kann die oauth2 funktionieren, aber ich kann nicht bekommen sie zusammen zu arbeiten.

Dies ist meine Konfiguration im Moment:

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); 
    } 

} 

}

Die Proble m ich immer folgende Fehlermeldung erhalten, wenn sie versuchen, die Homepage zu öffnen („/“)

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

Es ist nicht auf der Login-Seite nicht umleiten. Ich brauche diese Seite nicht, um durch oauth2 geschützt zu sein, aber selbst wenn ich direkt auf die Login-Seite gehe ("/ login", auf die ich zugreifen kann) und Anmeldeinformationen erhalte, bekomme ich immer noch den Fehler 'vollständige Authentifizierung ist erforderlich'. Obwohl ich grundlegende HTTP-Authentifizierung deaktiviert.

Kann jemand die normale Benutzerschnittstelle von den API-Endpunkten trennen, die von OAuth2 geschützt werden müssen?

+0

mit setzen haben Sie es geschafft, dieses Problem zu lösen? –

+0

Ich denke, Ihre WebSecurityConfig fehlt eine "Ignoriere alle URLs, die ich mit oauth" Konfiguration sichern möchte. Vielleicht kann so etwas benutzt werden ...: http://stackoverflow.com/questions/30366405/how-to-disable-spring-security-for-particular-url –

Antwort

2

können Sie versuchen, diese

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

Betrachtet/home ist eine Seite, die autorisiert werden muss.

+0

Danke für den Vorschlag, aber das autorisiert nur die Homepage, die die gleiche Fehlermeldung hat und nun die Root-Seite ("/") ist nicht authentifiziert –

1

Hallo müssen Sie Filter für jede Konfiguration in Ihrem Fall verwendet geben Sie benötigen:

in Web-Sicherheit configurtion

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

dies Web-Sicherheit Bypass Autorisierung/Ressource-Server-URLs

lassen und in der Ressourcenserver-Sicherheitskonfiguration

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

Dadurch kann die Ressourcensicherheit alle URLs außer "/ api/**" umgehen.

auf diese Weise Sie Aufträge von Konfiguration ignorieren können gibt es eine weitere Option durch eine der oben genannten Aktionen machen und seine Konfiguration in frühen Reihenfolge @Order

Verwandte Themen