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 statt hasRole.
InformationsquelleAutor gingerkid | 2015-11-12
Schreibe einen Kommentar