Spring Security Java-Konfiguration für authentifizierte Benutzer mit einer Rolle
Ich versuche zu konfigurieren, Spring Security mit Hilfe der Java-Konfiguration mit Spring Boot.
Meine WebSecurityConfig-Klasse hat eine Methode konfigurieren, wie dies
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/login", "/css/**", "/js/**", "/img/**", "/bootstrap/**" ).permitAll()
.antMatchers("/individual", "/application", "/upload").hasRole("USER")
.and()
.formLogin()
.loginPage("/login")
.successHandler(successHandler);
}
Bekomme ich die login-Seite gut für nicht authentifizierte Benutzer, und der Benutzer authentifiziert. Jedoch, wenn Sie versuchen, Zugriff auf den url /individuelle bekomme ich einen Fehler 403 und im Protokoll
2015-11-12 13:59:46.373 DEBUG 34468 --- [nio-8090-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/individual'; against '/'
2015-11-12 13:59:46.373 DEBUG 34468 --- [nio-8090-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/individual'; against '/login'
2015-11-12 13:59:46.373 DEBUG 34468 --- [nio-8090-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/individual'; against '/css/**'
2015-11-12 13:59:46.373 DEBUG 34468 --- [nio-8090-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/individual'; against '/js/**'
2015-11-12 13:59:46.374 DEBUG 34468 --- [nio-8090-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/individual'; against '/img/**'
2015-11-12 13:59:46.374 DEBUG 34468 --- [nio-8090-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/individual'; against '/bootstrap/**'
2015-11-12 13:59:46.374 DEBUG 34468 --- [nio-8090-exec-6] o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/individual'; against '/individual'
2015-11-12 13:59:46.374 DEBUG 34468 --- [nio-8090-exec-6] o.s.s.w.a.i.FilterSecurityInterceptor : Secure object: FilterInvocation: URL: /individual; Attributes: [hasRole('ROLE_USER')]
2015-11-12 13:59:46.374 DEBUG 34468 --- [nio-8090-exec-6] o.s.s.w.a.i.FilterSecurityInterceptor : Previously Authenticated: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@4c2eda81: Principal: org.springframework.security.core.userdetails.User@4c0ab982: Username: foo@bar.com; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: USER; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@fffc7f0c: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: 6E0BF830C070912EAC0050D1285D5CF9; Granted Authorities: USER
2015-11-12 13:59:46.374 DEBUG 34468 --- [nio-8090-exec-6] o.s.s.access.vote.AffirmativeBased : Voter: org.springframework.security.web.access.expression.WebExpressionVoter@6f192fd7, returned: -1
2015-11-12 13:59:46.386 DEBUG 34468 --- [nio-8090-exec-6] o.s.s.w.a.ExceptionTranslationFilter : Access is denied (user is not anonymous); delegating to AccessDeniedHandler
wenn ich ersetzen .hasRole("USER")
mit .authenticated()
es funktioniert und der Anwender bekommt die Seite gewünscht, aber keine Rolle ist, die überprüft wird.
Ich kann nicht herausfinden, wie Sie angeben, dass der Benutzer authentifiziert werden muss, und haben die Rolle BENUTZER. Ich habe mir viele Beispiele und versucht, viele Kombinationen, aber ich kann es nicht wie gewünscht. Die meisten Beispiele beziehen sich auf ältere XML-basierte Konfiguration als auch, was ich vermeiden möchte.
Was muss ich tun, um festzulegen, dass bestimmte URL-Muster kann zugegriffen werden mit authentifizierten Benutzern mit bestimmten Rollen?
Als angefordert, die Erfolgs-handler-Methode sieht wie folgt aus
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication auth)
throws IOException, ServletException {
//Here we want to check whether the user has already started the process and redirect to the appropriate stage
log.info("User {} has been authenticated", auth.getName());
if(auth.getName().equals("[email protected]"))
{
redirectStrategy.sendRedirect(request, response, "/individual");
return;
}
redirectStrategy.sendRedirect(request, response, "/application");
}
Beachten Sie, dass diese frühen Stadium WIP, pro die Kommentare im code. Ich weiß, das funktioniert, wie das Protokoll angezeigt wird und ohne die Rolle check in der Klasse WebSecurity die gewünschte Seite serviert wird.
EDIT : aufgefallen, ein Tippfehler in der Frage bezüglich der roleService.getDefaultRole(). Dies war ein Fehler und wurde korrigiert.
- Geben Sie nicht die Rolle als NUTZER, aber ROLE_USER.
- Siehe die Antwort unten & comment, das bewirkt, dass ein config Ausnahme
- Zeig mir den code, wo Sie Rollen zuweisen Benutzer wenn Sie angemeldet sind.
- Die log-Ausgabe zeigt, dass das Objekt für der Benutzer hat die Befugnis NUTZER, so dass ich weiß, es ist immer dem Benutzer zugeordnet
- Wie pro meine Antwort, die es entweder braucht, um sein ROLE_USER zugeordnet [email protected] ODER Sie überprüfen, für
hasAuthority
statthasRole
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass Ihr angemeldeter Benutzer [email protected] hat den falschen Behörden festgelegt. Im Protokoll können Sie sehen, sind die Behörden ['USER'], aber da Sie arbeiten mit Rollen sollte es sein, ['ROLE_USER']. Wo definierst du die Behörden für [email protected]?
Ansonsten versuchen Sie, die Umstellung
zu
Habe ich gelöst, meine eigene Frage zu, zum Teil Dank der verschiedenen Vorschläge, die hier mir macht der Forschung ist es anders. Auch darauf hingewiesen, dass FrontierPsychiatrist die Antwort, aber ich habe Sie nicht vor Ort die Antwort, während ich arbeiten war auf es.
Das problem ist, dass der Frühling interchangably bezieht sich auf ROLLEN und BEHÖRDEN.
Umsetzung der
UserDetailsService
Schnittstelle, um den Frühling zu laden, Benutzer-Datensätzen aus der Anwendungsdatenbank, ich war das erstellen einer Instanzorg.springframework.security.core.userdetails.User
und Einstellung der gewährten Behörden. Es kann gesehen werden in den log-Anweisungen, die das Benutzerobjekt hatte, das -Granted Authorities: USER
, aber dann ist meine Sicherheit config war die überprüfung für eine Rolle, und wenn das fehlschlägt. Die Lösung, einfach, war zu prüfen, eine Behörde statt. Ich habe auch aufgeräumt der config zu trennen von URL-mustern, um ignoriert zu werden von der security aus dem authentication & Autorisation. Komplette code-snippet untenIch hoffe wirklich, das hilft anderen bei der Nutzung Java-basierter Konfiguration mit Spring MVC 4.
Ändern Sie die Konfiguration, so etwas wie dieses.
und wenn Sie nicht wollen, dass alle die Anforderung authentifiziert werden, können Sie ersetzen Sie
anyRequest()
Methode mitantMatchers("/urls-goes-here")
Hier ist ein tutorial, das tut, was Sie versuchen zu implementieren:
http://www.jcombat.com/spring/custom-authentication-success-handler-with-spring-security
Ich vermute, Sie haben vergessen, das session-Attribute in Ihren handler: