Ich weiß, dass das Sichern der REST-API ein häufig kommentiertes Thema ist, aber ich kann keinen kleinen Prototyp erstellen, der meinen Kriterien entspricht (und ich muss bestätigen, dass diese Kriterien realistisch sind). Es gibt so viele Möglichkeiten, Ressourcen zu sichern und mit Spring Security zu arbeiten, dass ich klären muss, ob meine Anforderungen realistisch sind.
Meine Anforderungen
- Token-basierter Authentifikator - Benutzer geben ihre Anmeldeinformationen ein und erhalten ein eindeutiges und zeitlich begrenztes Zugriffstoken. Ich möchte die Tokenerstellung verwalten, die Gültigkeit und den Ablauf in meiner eigenen Implementierung überprüfen.
- Einige REST-Ressourcen sind öffentlich - Sie müssen sich überhaupt nicht authentifizieren.
- Einige Ressourcen sind nur für Benutzer mit Administratorrechten zugänglich.
- Andere Ressourcen sind nach der Autorisierung für alle Benutzer verfügbar.
- Ich möchte die Standardauthentifizierung nicht verwenden
- Java-Code-Konfiguration (nicht XML)
Aktueller Status
Meine REST-API funktioniert sehr gut, aber jetzt muss ich sie sichern. Als ich nach einer Lösung suchte, habe ich einen javax.servlet.Filter
Filter erstellt:
@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);
}
Diese Lösung mit javax.servlet.filters
funktioniert jedoch nicht so, wie ich es brauche, da es ein Problem mit der Ausnahmebehandlung über @ControllerAdvice
Spring gibt servlet dispatcher
.
Was ich brauche
Ich würde gerne wissen, ob diese Kriterien realistisch sind und Hilfe erhalten, wie Sie mit der Sicherung der REST-API mit Spring Security beginnen können. Ich habe viele Tutorials gelesen (z. B. Spring Data REST + Spring Security ), aber alle funktionieren in einer sehr einfachen Konfiguration - Benutzer mit ihren Anmeldeinformationen werden in der Konfiguration im Speicher gespeichert, und ich muss mit DBMS arbeiten und einen eigenen Authentifikator erstellen.
Bitte geben Sie mir einige Ideen, wie ich anfangen soll.
quelle
Spring Security ist auch sehr nützlich, um die REST-URLs zu authentifizieren und zu autorisieren. Wir müssen keine benutzerdefinierten Implementierungen angeben.
Zunächst müssen Sie den Einstiegspunkt-ref für 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.
@Component public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint { public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException ) throws IOException { response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized" ); } }
Danach müssen Sie RequestHeaderAuthenticationFilter angeben. Es enthält den RequestHeader-Schlüssel. Dies wird im Wesentlichen zur Identifizierung der Benutzerauthentifizierung verwendet. Im Allgemeinen überträgt RequestHeader diese Informationen während der REST-Aufrufe. Betrachten Sie zum Beispiel den folgenden Code
<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" ist der Schlüssel für die eingehende Anfrage. Es enthält die erforderlichen Authentifizierungsinformationen des Benutzers. Außerdem müssen Sie den PreAuthenticatedAuthenticationProvider so konfigurieren, dass er unsere Anforderungen erfüllt.
<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 dient zum Sichern der REST-URLs durch Authentifizierung und Autorisierung ohne benutzerdefinierte Implementierungen.
Den vollständigen Code finden Sie unter folgendem Link:
https://github.com/srinivas1918/spring-rest-security
quelle
Ich habe auch so lange gesucht. Ich arbeite an einem ähnlichen Projekt. Ich habe herausgefunden, dass Spring ein Modul hat, um die Sitzung über Redis zu implementieren. Es sieht einfach und nützlich aus. Ich werde auch zu meinem Projekt hinzufügen. Kann hilfreich sein:
http://docs.spring.io/spring-session/docs/1.2.1.BUILD-SNAPSHOT/reference/html5/guides/rest.html
quelle
Um die REST-API zu validieren, gibt es zwei Möglichkeiten
1 - Grundlegende Authentifizierung unter Verwendung des in der Datei application.properties festgelegten Standardbenutzernamens und -kennworts
Grundlegende Authentifizierung
2 - Authentifizieren Sie sich mithilfe der Datenbank (userDetailsService) mit dem tatsächlichen Benutzernamen und Passwort
Erweiterte Authentifizierung
quelle