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?
mit setzen haben Sie es geschafft, dieses Problem zu lösen? –
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 –