2015-09-13 12 views
50

Ich weiß, dass das Sichern der REST-API ein weithin kommentiertes Thema ist, aber ich kann keinen kleinen Prototyp erstellen, der meine Kriterien erfüllt (und ich muss bestätigen, dass diese Kriterien realistisch sind). Es gibt so viele Möglichkeiten, Ressourcen zu sichern und wie man mit Spring-Sicherheit arbeitet. Ich muss klären, ob meine Bedürfnisse realistisch sind.Wie sichere REST API mit Spring Boot und Spring Security?

Meine Anforderungen

  • Token basiert Authenticator - Benutzer seine Anmeldeinformationen liefern und einzigartige und zeitlich begrenzte Zugriffstoken erhalten. Ich möchte Token-Erstellung, Gültigkeitsprüfung, Ablauf in meiner eigenen Implementierung verwalten.
  • Einige Ressourcen REST sind öffentlich - keine Notwendigkeit, überhaupt zu authentifizieren,
  • Einige Ressourcen für Benutzer mit Administratorrechten nur zugänglich sein wird,
  • Andere Ressource wird nach Erteilung der Genehmigung für alle Benutzer zugänglich sein.
  • Ich will nicht die Standardauthentifizierung verwenden
  • Java-Code-Konfiguration (nicht XML)

Aktuelle Status

Mein REST API funktioniert sehr gut, aber jetzt brauche ich es zu sichern . Als ich nach einer Lösung gesucht habe ich ein javax.servlet.Filter Filter:

@Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 

     HttpServletRequest request = (HttpServletRequest) req; 

     String accessToken = request.getHeader(AUTHORIZATION_TOKEN); 
     Account account = accountDao.find(accessToken); 

     if (account == null) {  
      throw new UnauthorizedException();  
     } 

     chain.doFilter(req, res); 

    } 

Aber diese Lösung mit javax.servlet.filters nicht funktioniert, wie ich brauche, weil es ein Problem mit ist die Ausnahmebehandlung über @ControllerAdvice mit Feder servlet dispatcher.

Was ich

brauchen würde ich gerne wissen, ob diese Kriterien realistisch sind und keine Hilfe bekommen, wie mit Spring Security Sicherung REST API zu starten. Ich lese viele Tutorials (z. B. Spring Data REST + Spring Security), aber alle arbeiten in sehr einfacher Konfiguration - Benutzer mit ihre Anmeldeinformationen sind im Speicher in der Konfiguration gespeichert und ich muss mit DBMS arbeiten und eigene authenticator erstellen.

Bitte geben Sie mir einige Ideen, wie ich anfangen soll.

Antwort

36

Token basierende Authentifizierung - Benutzer seine Anmeldeinformationen bereitstellen und einmalige und zeitlich begrenzte Zugriffstoken erhalten. Ich möchte Token verwalten Erstellung, Überprüfung Gültigkeit, Ablauf in meiner eigenen Implementierung.

Eigentlich Verwendung Filter für Token Auth - beste Weg, in diesem Fall

Schließlich Sie CRUD über Spring Data für die Verwaltung von Tokens Eigenschaften erstellen möchten ablaufen usw.

Hier ist mein Token Filter: http://pastebin.com/13WWpLq2

Und Token Service Implementation

http://pastebin.com/dUYM555E

Einige Ressourcen REST sind öffentlich - keine Notwendigkeit, auf allen

zu authentifizieren Es ist kein Problem, Sie können Ihre Ressourcen verwalten v ia Spring Security Config wie folgt aus: .antMatchers("/rest/blabla/**").permitAll()

Einige Ressourcen für Benutzer mit Administratorrechten nur zugänglich sein wird,

einen Blick auf @Secured Anmerkung zu Klasse nehmen. Beispiel:

@Controller 
@RequestMapping(value = "/adminservice") 
@Secured("ROLE_ADMIN") 
public class AdminServiceController { 

Die andere Ressource wird nach Erteilung der Genehmigung für alle Benutzer zugänglich sein.

Zurück zu Spring Security konfigurieren, können Sie Ihre URL wie folgt konfigurieren:

http 
      .authorizeRequests() 
      .antMatchers("/openforall/**").permitAll() 
      .antMatchers("/alsoopen/**").permitAll() 
      .anyRequest().authenticated() 

Ich will nicht die Standardauthentifizierung

Yep verwenden, über Token-Filter, Ihre Benutzer werden authentifiziert.

Java-Code-Konfiguration (nicht XML)

Zurück zu den Worten oben, Blick auf @EnableWebSecurity. Ihre Klasse wird sein:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter {} 

Sie haben die configure Methode außer Kraft zu setzen. Code unten, nur zum Beispiel, wie man Matcher konfiguriert. Es ist von einem anderen Projekt.

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
      .authorizeRequests() 
      .antMatchers("/assets/**").permitAll() 
      .anyRequest().authenticated() 
      .and() 
      .formLogin() 
       .usernameParameter("j_username") 
       .passwordParameter("j_password") 
       .loginPage("/login") 
       .defaultSuccessUrl("/", true) 
       .successHandler(customAuthenticationSuccessHandler) 
       .permitAll() 
      .and() 
       .logout() 
       .logoutUrl("/logout") 
       .invalidateHttpSession(true) 
       .logoutSuccessUrl("/") 
       .deleteCookies("JSESSIONID") 
       .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) 
      .and() 
       .csrf(); 
} 
+0

können Sie mir in meiner Frage bitte helfen? https://stackoverflow.com/questions/46065063/spring-boot-basic-authentication –

+0

Jedes Beispielprojekt, das alle Anforderungen enthält? –

3

Frühling Sicherheit auch sehr nützlich für die Authentifizierung und Autorisierung des REST-URLs bereitstellt. Wir müssen keine benutzerdefinierten Implementierungen angeben.

Zuerst müssen Sie den Eintragspunkt-ref zu restAuthenticationEntryPoint in Ihrer Sicherheitskonfiguration wie folgt angeben.

<security:http pattern="/api/**" entry-point-ref="restAuthenticationEntryPoint" use-expressions="true" auto-config="true" create-session="stateless" > 

    <security:intercept-url pattern="/api/userList" access="hasRole('ROLE_USER')"/> 
    <security:intercept-url pattern="/api/managerList" access="hasRole('ROLE_ADMIN')"/> 
    <security:custom-filter ref="preAuthFilter" position="PRE_AUTH_FILTER"/> 
</security:http> 

Die Implementierung für den RestAuthenticationEntryPoint könnte wie folgt aussehen.

Danach müssen Sie RequestHeaderAuthenticationFilter angeben. Es enthält den Schlüssel RequestHeader. Dies wird im Wesentlichen zur Identifizierung der Benutzerauthentifizierung verwendet. Im Allgemeinen trägt RequestHeader diese Information bei den REST-Aufrufen. Zum Beispiel betrachten Code unten

<bean id="preAuthFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter"> 
    <property name="principalRequestHeader" value="Authorization"/> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    </bean> 

Hier

<property name="principalRequestHeader" value="Authorization"/> 

"Autorisierung" die der Schlüssel ist, die eingehende Anforderung präsentiert. Es enthält die erforderlichen Authentifizierungsinformationen des Benutzers. Sie müssen auch den PreAuthenticatedAuthenticationProvider konfigurieren, um unsere Anforderung zu erfüllen.

<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider"> 
<property name="preAuthenticatedUserDetailsService"> 
    <bean id="userDetailsServiceWrapper" 
     class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper"> 
    <property name="userDetailsService" ref="authenticationService"/> 
    </bean> 
</property> 
</bean> 

Dieser Code wird zum Sichern der REST-URLs mittels Authentifizierung und Autorisierung ohne benutzerdefinierte Implementierungen verwendet.

Für die kompletten Code bitte den folgenden Link finden:

https://github.com/srinivas1918/spring-rest-security

0

Um REST API zu Validierung gibt es 2 Möglichkeiten

1 - Standardauthentifizierung mit Standard-Benutzername und das Kennwort in application.properties Datei einrichten

Basic Authentication

2 - Authentifizieren Datenbank (u serDetailsService) mit den tatsächlichen Benutzernamen und ein Passwort

Advanced Authentication

Verwandte Themen