2016-07-26 28 views
2

Wir entwickeln die Spring 4-REST/JSON-API, benötigen aber einen benutzerdefinierten Authentifizierungsdienst zur Authentifizierung gegenüber dem Dienst eines Drittanbieters.Spring-Sicherheit 4. JSON-REST mit benutzerdefinierter Authentifizierung und Autorisierung

Einschränkungen: Wir nicht möchte den Benutzer nach Benutzername/Passwort fragen. Wir authentifizieren uns mit "Cookie" (senden Sie mit dem Initiator der Anfrage). Und wir brauchen diesen Authentifizierungsprozess im Hintergrund. (Kann komisch klingen, aber das ist der Fall).

können wir das mit der Registrierung von benutzerdefinierten Authentifizierung/Autorisierungsanforderung Filter implementieren. Aber das hat dazu geführt, dass wir die Macht des "Autorisierungs" -Moduls im Frühling verloren haben, das wir später nutzen wollen.

Also, was wir bisher getan haben, schrieben individuellen WebSecurityConfigurerAdapter mit unserem eigenen kundenspezifischen AuthenticationProvider und UserDetailsService aber diese Konfiguration scheint nicht zu funktionieren.

die Anwendung geht nicht innerhalb AuthenticationProvider.authenticate

hier ist die Konfiguration, die wir hatten.

AuthenticationProvider.java:

@Service 
public class AuthenticationService implements AuthenticationProvider, UserDetailsService { 

     @Override 
    public Authentication authenticate(Authentication auth) throws AuthenticationException { 
     // DOESN'T ENTER THIS FUNCTION 
     // do authentication stuff 
    } 


    @Override 
    public boolean supports(Class<?> authentication) { 
     // JUST FOR TESTING 
     return true; 
    } 


    @Override 
    public UserDetails loadUserByUsername(String username) 
      throws UsernameNotFoundException { 

     // DOESN'T ENTER THIS METHOD 
     return null; 
    } 
} 

SecurityConfig.java:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    private static final Logger LOGGER = LoggerFactory.getLogger(SecurityConfig.class); 

    @Autowired 
    private AuthenticationService authService; 

    @Override 
    public void configure(WebSecurity web) throws Exception { 
     web.ignoring().antMatchers("/ignoredURL/**"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.csrf().disable() //HTTP with Disable CSRF 
       .authorizeRequests() 
        .antMatchers("/api/XYZ/**").hasRole("ADMIN") 
        .anyRequest().authenticated(); 
     // adding ".httpBasic()" automatically prompts user for username/password 
    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     // THIS IS NOT TYPO, I use one service implements both interfaces. 
     auth.userDetailsService(authService); 
     auth.authenticationProvider(authService); 
    } 


} 

Antwort

1

2 durch Hinzufügen von mehr Klassen Fest (Filter AbstractPreAuthenticatedProcessingFilter und andere Klasse erstreckenden CustomUser Arbeitsgeräte UserDetails) machte dann meine AuthenticaitonService implementiert spring UserDetailsService hier sind die details:

haben bitte einen Blick auf what this filter does and how it works

1- Erstellen AbcFilter Frühling AbstractPreAuthenticatedProcessingFilter

2- außer Kraft setzen "getPreAuthenticatedPrincipal" erstreckt. Diese Methode extrahiert den Wert cookie und gibt ihn zurück. (Was auch immer das Objekt, das Sie hier zurückgeben, ist, was Sie als Parameter in UserDetailsService.loadUserByUsername erhalten).

3- Modified mein Service zu implementieren Feder UserDetailsService und innerhalb loadUserByUsername tat alle Authentifizierungslogik hier und setzen Sie alle angemeldeten Benutzer in CustomUser Objekt. Dann gib es zurück.

4- Wenn die Anfrage mit /api/XYZ/** übereinstimmt, ruft Spring Ihre CustomUser.getAuthorities an und versucht, die ADMIN Rolle dort zu finden.