2015-10-19 13 views
14

Ho questo codice nel mio Web Security Config:Prefisso di sicurezza Spring aggiunto "ROLE_" a tutti i nomi dei ruoli?

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
      .authorizeRequests() 
      .antMatchers("/api/**") 
      .hasRole("ADMIN") 
      .and() 
      .httpBasic().and().csrf().disable(); 

} 

così ho aggiunto un utente con il ruolo "admin" nel mio database e ottengo sempre 403 errore quando ho provato loggin con questo utente, poi ho attivato registro per la primavera e ho trovato questa linea:

2015-10-18 23:13:24.112 DEBUG 4899 --- [nio-8080-exec-1] o.s.s.w.a.i.FilterSecurityInterceptor : Secure object: FilterInvocation: URL: /api/user/login; Attributes: [hasRole('ROLE_ADMIN')] 

Perché primavera di sicurezza è alla ricerca di "ROLE_ADMIN" invece "Admin"?

+0

Eventuali duplicati di [Primavera ruolo di sicurezza Prefisso e su misura per l'utente Dettagli Servizio] (http://stackoverflow.com/questions/4951832/spring-security-role-prefix-and-custom -user-details-service) – Bruno

risposta

8

La sicurezza di primavera aggiunge il prefisso "ROLE_" per impostazione predefinita.

Se si desidera che questo rimosso o modificato, un'occhiata a

http://forum.spring.io/forum/spring-projects/security/51066-how-to-change-role-from-interceptor-url

EDIT: trovato anche questo: Spring Security remove RoleVoter prefix

+0

Solo una domanda, Spring aggiunge ROLE_ di default se aggiungo un ruolo nell'annotazione @Secured? Come se aggiungessi @Secured ("abc"), Spring controllerà per ROLE_abc o semplicemente abc? –

+0

@SajibAcharya è possibile modificare il valore predefinito 'ROLE_'. vedere http://stackoverflow.com/questions/38134121/how-do-i-remove-the-role-prefix-from-spring-security-with-javaconfig/38970309#38970309 – walsh

9

a Spring 4, ci sono due metodi hasAuthority() e hasAnyAuthority() definiti nella classe org.springframework.security.access.expression.SecurityExpressionRoot. Questi due metodi controllano solo il nome del ruolo personalizzato senza aggiungendo il prefisso ROLE_. Definizione come segue: l'utilizzo

public final boolean hasAuthority(String authority) { 
    return hasAnyAuthority(authority); 
} 
public final boolean hasAnyAuthority(String... authorities) { 
    return hasAnyAuthorityName(null, authorities); 
} 
private boolean hasAnyAuthorityName(String prefix, String... roles) { 
    Set<String> roleSet = getAuthoritySet(); 

    for (String role : roles) { 
     String defaultedRole = getRoleWithDefaultPrefix(prefix, role); 
     if (roleSet.contains(defaultedRole)) { 
      return true; 
     } 
    } 

    return false; 
} 
private static String getRoleWithDefaultPrefix(String defaultRolePrefix, String role) { 
    if (role == null) { 
     return role; 
    } 
    if (defaultRolePrefix == null || defaultRolePrefix.length() == 0) { 
     return role; 
    } 
    if (role.startsWith(defaultRolePrefix)) { 
     return role; 
    } 
    return defaultRolePrefix + role; 
} 

Esempio:

<http auto-config="false" use-expressions="true" pattern="/user/**" 
     entry-point-ref="loginUrlAuthenticationEntryPoint"> 
    <!--If we use hasAnyAuthority, we can remove ROLE_ prefix--> 
    <intercept-url pattern="/user/home/yoneticiler" access="hasAnyAuthority('FULL_ADMIN','ADMIN')"/> 
    <intercept-url pattern="/user/home/addUser" access="hasAnyAuthority('FULL_ADMIN','ADMIN')"/> 
    <intercept-url pattern="/user/home/addUserGroup" access="hasAuthority('FULL_ADMIN')"/> 
    <intercept-url pattern="/user/home/deleteUserGroup" access="hasAuthority('FULL_ADMIN')"/> 
    <intercept-url pattern="/user/home/**" access="hasAnyAuthority('FULL_ADMIN','ADMIN','EDITOR','NORMAL')"/> 
    <access-denied-handler error-page="/403"/> 
    <custom-filter position="FORM_LOGIN_FILTER" ref="customUsernamePasswordAuthenticationFilter"/> 
    <logout logout-url="/user/logout" 
      invalidate-session="true" 
      logout-success-url="/user/index?logout"/> 
    <!-- enable csrf protection --> 
    <csrf/> 
</http> <beans:bean id="loginUrlAuthenticationEntryPoint" 
      class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> 
    <beans:constructor-arg value="/user"/> 
</beans:bean> 
1

Come @olyanren triste, è possibile utilizzare il metodo() hasAuthority a Spring 4 invece di hasRole(). Io sono l'aggiunta JavaConfig esempio:

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    .authorizeRequests() 
    .antMatchers("/api/**") 
    .access("hasAuthority('ADMIN')") 
    .and() 
    .httpBasic().and().csrf().disable(); 
} 
Problemi correlati