Назначение роли безопасности Spring

Контейнеры JEE обычно предоставляют механизм, использующий проприетарные дескрипторы развертывания для сопоставления внешних и внутренних пользовательских ролей. То есть приложение объявляет и использует внутренние роли в web.xml, и есть файл (например, weblogic.xml для weblogic), который сопоставляет фактические роли, назначенные пользователю, с внутренними.

Как можно добиться такого сопоставления при использовании Spring Security? Я использую Spring Security 3.0.x.


person yannisf    schedule 14.04.2014    source источник


Ответы (1)


Весенняя безопасность 3.0.x. не обеспечивает такое сопоставление из коробки.

Но вы можете реализовать его самостоятельно, расширив поставщика аутентификации, который используется для вашего метода аутентификации.

Если вы используете DaoAuthenticationProvider (который внутри использует UserDetailsService), вы можете переопределить метод addCustomAuthorities(String username, List<GrantedAuthority> authorities), чтобы добавить новые/сопоставленные роли в соответствии с уже предоставленными однажды.

например расширенный UserDetailsService :

...
@Override
protected void addCustomAuthorities(String username, List<GrantedAuthority> authorities) {
    super.addCustomAuthorities(username, authorities);

    List<GrantedAuthority> additional = new ArrayList<GrantedAuthority>();
    for (GrantedAuthority role : authorities) {
        additional .addAll(vourMappingService.getAdditionalForRole(role));
    }
    authorities.addAll(additional );
}

которые используют YourMappingService для сопоставления ролей (путем добавления новых ролей к существующим один раз)

public class YourMappingService


 /**
     * Property bases mapping of roles to privileges.
     * Every role is one line, the privileges are comma separated.
     */
    private Properties roleToPrivileges;

    public YourMappingService(Properties roleToPrivileges) {
        if (roleToPrivileges == null) {
            throw new IllegalArgumentException("roleToPrivileges must not be null");
        }
        this.roleToPrivileges = roleToPrivileges;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAdditionalForRole(GrantedAuthority role) {

        String authority = role.getAuthority();
        if(authority != null) {
            String commaSeparatedPrivileges = roleToPrivileges.getProperty(role.getAuthority());
            if (commaSeparatedPrivileges != null) {
                List<GrantedAuthority> privileges = new ArrayList<GrantedAuthority>();
                for(String privilegeName : StringUtils.commaDelimitedListToSet(commaSeparatedPrivileges)) {
                    privileges.add(new GrantedAuthorityImpl(privilegeName.trim()));
                }                
                return privileges;
            } else {
                return Collections.emptyList();
            }
        } else {
            return Collections.emptyList();
        }
    }   
}

конфигурация:

<bean id="myUserDetailsService" class="de.humanfork.springsecurityroles.impl.JdbcDaoPrivilegesImpl">
    <constructor-arg ref="yourMappingService"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="usersByUsernameQuery" value="SELECT login,encryptedPassword,loginEnabled FROM user WHERE login = ?"/>
    <property name="enableAuthorities" value="true"/>
    <property name="authoritiesByUsernameQuery" value="SELECT u.login, r.securityRoles FROM user u, user2security_roles r WHERE u.login= ? AND u.id = r. User_fk;"/>
</bean>


  <bean id="yourMappingService" class="ZourMappingService">
    <constructor-arg>
        <props>
        <prop key="ROLE_ADMIN">
                ROLE_backend_access,
                ROLE_user_mngt,
                ROLE_passwordLostRequest_mngt,
                ROLE_log_mngt
            </prop>
            <prop key="ROLE_USER">
            </prop>
        </props>
    </constructor-arg>
</bean>
person Ralph    schedule 14.04.2014