2015-08-27 6 views
6

Ich fange gerade an, mit Spring Security zu programmieren, und ich schrieb System, wo ich Benutzer in der Tabelle speichern, die über Hibernate persistiert. Mit Spring Security Referenz Ich schrieb dieses Stück Code:Wie füge ich einen neuen Benutzer zu Spring Security in Runtime hinzu

import org.springframework.beans.factory.annotation.Autowired; 

import org.springframework.context.annotation.*; 
import org.springframework.security.config.annotation.authentication.builders.*; 
import org.springframework.security.config.annotation.web.configuration.*; 

@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
      .inMemoryAuthentication() 
       .withUser("user").password("password").roles("USER"); 
    } 
} 

Und das funktioniert perfekt, aber es gibt einen Punkt - Benutzer während Serverstart geladen wird. Ich muss die Methode RegisterUser (Benutzerbenutzer) schreiben, die Spring Security in Runtime einen neuen Benutzer hinzufügt. Diese Methode sollte sich nur auf diese Aufgabe konzentrieren. Ich weiß nicht, wie ich anfangen soll, diese Funktion zu implementieren, also danke für irgendwelche Ratschläge! ;)

Ofc Benutzer haben Felder wie Login, Passwort, Rollen String etc etc ...

Bitte schreiben Sie keine Lösungen mit Spring MVC. Dieses System ist RESTful App mit Spring Web Boost und Spring Security-Boost in Version 4.0.x

+0

Jemand wird helfen? –

+0

Es gibt Spring Security + Hibernate-Beispiele da draußen, geben Sie eine Suche. Zum Beispiel: http://www.mkyong.com/spring-security/spring-security-hibernate-annotation-example/ – holmis83

+0

Bitte haben Sie eine Lösung für Ihr Problem gefunden, könnten Sie den Code posten? –

Antwort

3

Sie wahrscheinlich Ihre Benutzer in einer Datenbank gespeichert werden sollen und nicht im Speicher, wenn sie :)

  1. Registrierung werden erstellen Sie die authorities für den Benutzer

    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
    authorities.add(new SimpleGrantedAuthority("ROLE_USER")); 
    
  2. Instantiate der Benutzer (mit einer Klasse Umsetzung UserDetails)

    UserDetails user = new User("[email protected]", passwordEncoder.encode("s3cr3t"), authorities); 
    
  3. Speichern Sie den Benutzer irgendwo nützlich. Die JdbcUserDetailsManager kann einen Benutzer einfach in einer Datenbank speichern.

    userDetailsManager.createUser(user); 
    
  4. erstellen UsernamePasswordAuthenticationToken

    Authentication authentication = new UsernamePasswordAuthenticationToken(user, null, authorities); 
    
  5. die Authentifizierung In der SecurityContext

    SecurityContextHolder.getContext().setAuthentication(authentication); 
    
+1

Wo erstelle ich diesen Benutzer und SecurityContext? –

+0

@PhilippJahoda SecurityContext wird von Spring erstellt. Sie möchten den Benutzer in Ihrer Registrierungslogik erstellen, nachdem Sie Informationen vom Benutzer erhalten haben (z. B. den gewünschten Benutzernamen und das Kennwort), wahrscheinlich in einer von einem Controller verwendeten Serviceebene. –

+0

Vielen Dank für Ihre Antwort. Ich benutze die Spring URL/OAUTH/Token, ist das nicht korrekt? Wo kann ich auf den Benutzernamen und das Passwort dieser URL zugreifen? –

0

Verwendung diesen Code Behörde aktuellen Benutzer hinzuzufügen:

List<GrantedAuthority> authorities = new ArrayList<>(); 
authorities.add(new SimpleGrantedAuthority("ROLE_NEWUSERROLE'); 
    SecurityContextHolder.getContext().setAuthentication(
     new UsernamePasswordAuthenticationToken(
      SecurityContextHolder.getContext().getAuthentication().getPrincipal(), 
      SecurityContextHolder.getContext().getAuthentication().getCredentials(), 
      authorities) 
     ); 
Verwandte Themen