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?
Czy uda Ci się rozwiązać ten problem? –
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 –