Hinzufügen von benutzerdefinierten UserDetailsService zu Spring Security OAuth2-app
Wie füge ich die custom UserDetailsService
unten, um in diesem Frühjahr OAuth2 Probe?
Den Standard - user
mit Standard - password
definiert wird, in der Anwendung.Eigenschaften
- Datei des authserver
app.
Allerdings würde ich gerne fügen Sie die folgenden benutzerdefinierten UserDetailsService
zu die demo
- Paket authserver
app für Testzwecke:
package demo;
import java.util.List;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.provisioning.UserDetailsManager;
import org.springframework.stereotype.Service;
@Service
class Users implements UserDetailsManager {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
String password;
List<GrantedAuthority> auth = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_USER");
if (username.equals("Samwise")) {
auth = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_HOBBIT");
password = "TheShire";
}
else if (username.equals("Frodo")){
auth = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_HOBBIT");
password = "MyRing";
}
else{throw new UsernameNotFoundException("Username was not found. ");}
return new org.springframework.security.core.userdetails.User(username, password, auth);
}
@Override
public void createUser(UserDetails user) {//TODO Auto-generated method stub
}
@Override
public void updateUser(UserDetails user) {//TODO Auto-generated method stub
}
@Override
public void deleteUser(String username) {//TODO Auto-generated method stub
}
@Override
public void changePassword(String oldPassword, String newPassword) {
//TODO Auto-generated method stub
}
@Override
public boolean userExists(String username) {
//TODO Auto-generated method stub
return false;
}
}
Wie Sie sehen können, diese UserDetailsService
ist nicht autowired
noch, und es bewusst verwendet unsichere Passwörter, denn es ist nur für Testzwecke geeignet.
Welche konkreten änderungen vorgenommen werden müssen,auf der GitHub-Beispiel-app, so dass ein Benutzer sich einloggen können als username=Samwise
mit password=TheShire
oder als username=Frodo
mit password=MyRing
? Haben Veränderungen vorgenommen werden müssen, AuthserverApplication.java
oder anderswo?
VORSCHLÄGE:
Den Frühjahr OAuth2 Developer Guide sagt zu einem GlobalAuthenticationManagerConfigurer
zu konfigurieren UserDetailsService
weltweit. Aber googeln mit diesen Namen weniger produziert als hilfreiche Ergebnisse.
Auch eine andere app, die verwendet interne Feder Sicherheit STATT OAuth verwendet die folgende syntax, um hook up die UserDetailsService
, aber ich bin nicht sicher, wie Sie Sie, um Ihre syntax, um die aktuelle OP:
@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
protected static class AuthenticationSecurity extends GlobalAuthenticationConfigurerAdapter {
@Autowired
private Users users;
@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(users);
}
}
Versuchte ich mit @Autowire
innerhalb der OAuth2AuthorizationConfig
zu verbinden Users
zu den AuthorizationServerEndpointsConfigurer
wie folgt:
@Autowired//THIS IS A TEST
private Users users;//THIS IS A TEST
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager)
.accessTokenConverter(jwtAccessTokenConverter())
.userDetailsService(users)//DetailsService)//THIS LINE IS A TEST
;
}
Aber die Spring-Boot-logs zeigen an, dass der Benutzer Samwise
wurde nicht gefunden, was bedeutet, dass die UserDetailsService
war nicht erfolgreich angeschlossen. Hier ist der entsprechende Auszug aus der Spring-Boot-Protokolle:
2016-04-20 15:34:39.998 DEBUG 5535 --- [nio-9999-exec-9] o.s.s.a.dao.DaoAuthenticationProvider :
User 'Samwise' not found
2016-04-20 15:34:39.998 DEBUG 5535 --- [nio-9999-exec-9]
w.a.UsernamePasswordAuthenticationFilter :
Authentication request failed:
org.springframework.security.authentication.BadCredentialsException:
Bad credentials
Was kann ich sonst noch versuchen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich lief in ein ähnliches Problem bei der Entwicklung meiner oauth-server mit Spring Security. Meine situation war etwas anders, als ich wollte hinzufügen, eine
UserDetailsService
zu authentifizieren refresh Token, aber ich denke meine Lösung wird Ihnen helfen, wie gut.Wie Sie, habe ich zunächst versucht, die Angabe der
UserDetailsService
mit derAuthorizationServerEndpointsConfigurer
, aber das funktioniert nicht. Ich bin mir nicht sicher, ob das ein bug ist oder beabsichtigt, aber dieUserDetailsService
muss festgelegt werden, in derAuthenticationManager
um für die verschiedenen oauth2-Klassen zu finden. Dieser arbeitete für mich:Ich denke, wenn Sie die folgenden, beginnend bei Zeile 73, es kann für Sie arbeiten:
Würden Sie natürlich auch hinzufügen müssen
@Autowired Users userDetailsService;
irgendwo inWebSecurityConfigurerAdapter
Andere Dinge, die ich erwähnen wollte:
GlobalAuthenticationManagerConfigurer
bezeichnet in der Führung ist fast sicher ein Tippfehler, ich kann nicht finden, dass der string irgendwo in den Quellcode für alles im Frühjahr.AuthenticationManagerBuilder
im code. Es würde nicht stattgefunden haben, mit, dass die string-literal, aber es funktioniert mitglobalAuthBuilder
. Überprüfen Sie meine gepostete Lösung unten.Ich lief in das gleiche Problem hatte und ursprünglich die gleiche Lösung wie Manan Mehta geschrieben. Gerade vor kurzem, eine version der Kombination von spring security und spring oauth2 führte jeder Versuch zu aktualisieren Token, was eine HTTP 500-Fehlermeldung, die besagt, dass
UserDetailsService is required
in meinen logs.Den entsprechenden stack trace sieht so aus:
Sehen Sie unten die
DefaultTokenServices
versucht, aktualisieren Sie das token. Es ruft dann in eineAuthenticationManager
erneut authentifizieren zu müssen (im Fall, dass der Benutzer Widerruf die Erlaubnis, oder der Benutzer wurde gelöscht, etc.) aber dies ist, wo alles entwirrt. Sehen Sie oben in der stack-traceUserDetailsServiceDelegator
ist, was bringt der Aufruf vonloadUserByUsername
statt meiner schönenUserDetailsService
. Obwohl in meinemWebSecurityConfigurerAdapter
ich dieUserDetailsService
gibt es zwei weitereWebSecurityConfigurerAdapter
s. Eine für dieResourceServerConfiguration
und eine für dieAuthorizationServerSecurityConfiguration
und diese Konfigurationen nie dieUserDetailsService
dass ich.In der Verfolgung aller den Weg durch Spring Security, um Stück zusammen, was ist Los, habe ich festgestellt, dass es eine "lokale"
AuthenticationManagerBuilder
und eine "Globale"AuthenticationManagerBuilder
und wir müssen es auf die internationale version haben, um diese Informationen zu übergeben, um diese anderen generator zusammenhängen.So, die Lösung kam ich mit war, um die "global" - version in der gleichen Weise die anderen Zusammenhänge waren immer die internationale version. In meinem
WebSecurityConfigurerAdapter
hatte ich folgende:Funktionierte. Anderen Kontexten nun hatte meine
UserDetailsService
. Ich lasse dies hier für jeden tapferen Soldaten, die stolpern das Minenfeld in die Zukunft.Für jemand
UserDetailsService is required
Fehler, wenn dabei die refresh-token, und Sie bestätigen, dass Sie bereitsUserDetailsService
bean.versuchen, fügen Sie diese:
Dies ist mein Versuch und Irrtum, vielleicht nicht für Sie arbeiten.
Durch die Art und Weise, wenn Sie aufgeben "denke", die Bohne wird pick by Frühling, Sie können erweitert
AuthorizationServerConfigurerAdapter
undWebSecurityConfigurerAdapter
- und config-alles Sachen, die Sie selbst, aber ich denke, es ist die macht verlieren, der Frühling autoconfig.Warum muss ich config alles soweit, ich muss nur passen einige config?
Meine Voraussetzung war, um ein database-Objekt von der Rückseite des oauth2 E-Mail-Attribut. Ich fand diese Frage, wie ich annahm, die ich brauche, erstellen Sie einen benutzerdefinierten Benutzer-details-service. Eigentlich brauche ich zu implment die OidcUser-Schnittstelle und Haken Sie in diesem Prozess.
Anfangs dachte ich, es war die OAuth2UserService, aber ich habe mein AWS-Cognito Authentifizierungs-provider, so dass es open-id-connect..
Den benutzerdefinierten Dienst ist, wo jeder maßgeschneiderten Logik gehen kann.
Ich Plane über die Umsetzung
UserDetails
- Schnittstelle auf meinemCustomUserPrincipal
so kann ich verschiedene Authentifizierungs-Mechanismen für die live und test zu erleichtern, automatisierte ui-Tests.