【问题标题】:Handling roles when authenticated to active directory with spring security 3.1使用 spring security 3.1 对活动目录进行身份验证时处理角色
【发布时间】:2012-02-08 18:51:20
【问题描述】:

我正在尝试使用 Spring Security 3.1 对 Active Directory 进行身份验证。 我通过了身份验证,一切都很好。

<sec:ldap-server id="ldapServer" url="ldap://ldap/dc=sub,dc=domain,dc=com" port="389" />

<sec:authentication-manager erase-credentials="true"  >
    <sec:authentication-provider ref="ldapActiveDirectoryAuthProvider" />
</sec:authentication-manager>

<bean id="ldapActiveDirectoryAuthProvider" 
        class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
    <constructor-arg value="domain" />
    <constructor-arg value="ldap://server:389/"/> 
</bean>

现在回答问题。如何处理用户的角色以便我可以设置过滤器?

例如。

<sec:intercept-url pattern="/**" access="ROLE_USER"/>

解决方案

我发现了如何使用 UserDetailContextMapper 并将我的 AD 组映射到 ROLE_USER、ROLE_ADMIN 等。

    <bean id="ldapActiveDirectoryAuthProvider" 
        class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
    <constructor-arg value="domain" />
    <constructor-arg value="ldap://host:389/"/> 
    <property name="userDetailsContextMapper" ref="tdrUserDetailsContextMapper"/>
    <property name="useAuthenticationRequestCredentials" value="true"/>
</bean>

<bean id="tdrUserDetailsContextMapper" class="com.bla.bla.UserDetailsContextMapperImpl"/>

映射器类:

public class UserDetailsContextMapperImpl implements UserDetailsContextMapper, Serializable{
    private static final long serialVersionUID = 3962976258168853954L;

    @Override
    public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<? extends GrantedAuthority> authority) {

        List<GrantedAuthority> mappedAuthorities = new ArrayList<GrantedAuthority>();


        for (GrantedAuthority granted : authority) {

            if (granted.getAuthority().equalsIgnoreCase("MY USER GROUP")) {
                mappedAuthorities.add(new GrantedAuthority(){
                    private static final long serialVersionUID = 4356967414267942910L;

                    @Override
                    public String getAuthority() {
                        return "ROLE_USER";
                    } 

                });
            } else if(granted.getAuthority().equalsIgnoreCase("MY ADMIN GROUP")) {
                mappedAuthorities.add(new GrantedAuthority() {
                    private static final long serialVersionUID = -5167156646226168080L;

                    @Override
                    public String getAuthority() {
                        return "ROLE_ADMIN";
                    }
                });
            }
        }
        return new User(username, "", true, true, true, true, mappedAuthorities);
    }

    @Override
    public void mapUserToContext(UserDetails arg0, DirContextAdapter arg1) {
    }
}

【问题讨论】:

  • 嘿,你能指导我开始使用 ldap。我发现他们的文档参差不齐。 IE 谈论配置文件,但我不知道把它们放在哪里

标签: spring active-directory spring-security ldap


【解决方案1】:

您还可以注入 GrantedAuthoritiesMapper,它是在 3.1 中引入的,作为修改权限的一般策略。另外,您可能希望将SimpleGrantedAuthority 用于GrantedAuthority 实现。或者,您可以使用枚举,因为您有一组固定的值:

enum MyAuthority implements GrantedAuthority {
    ROLE_ADMIN,
    ROLE_USER;

    public String getAuthority() {
        return name();
    }
}


class MyAuthoritiesMapper implements GrantedAuthoritiesMapper {

    public Collection<? extends GrantedAuthority> mapAuthorities(Collection<? extends GrantedAuthority> authorities) {
        Set<MyAuthority> roles = EnumSet.noneOf(MyAuthority.class);

        for (GrantedAuthority a: authorities) {
            if ("MY ADMIN GROUP".equals(a.getAuthority())) {
                roles.add(MyAuthority.ROLE_ADMIN);
            } else if ("MY USER GROUP".equals(a.getAuthority())) {
                roles.add(MyAuthority.ROLE_USER);
            }
        }

        return roles;
    }
}

【讨论】:

  • 感谢您的出色回答。我在春季文档中忽略了它吗?使用 ldap-authentication-provideruser-context-mapper-ref 只需几行就可以设置 ldap 配置,不过我花了一段时间才找到。
  • 你能链接或写一个完整的例子吗?我使用它,但看起来我的用户仍然拥有 Active Directory 组作为权限
【解决方案2】:

beans.xml 中的角色必须与 memberOf 值属性的 CN(通用名称)完全匹配。您应该阅读有关目录基础的教程。

假设有这个用户: CN=Michael-O,OU=Users,OU=department,DC=sub,DC=company,DC=net 在他的上下文中存在这个 memberOf 值 CN=Group Name,OU=Permissions,OU=Groups,OU=department,DC=sub,DC=company,DC=net

Bean 将定位此 memberOf 值并提取 Group Name。你 beans.xml 必须有这个值。

【讨论】:

  • 我的问题可能有些不清楚。我将我的解决方案添加到我的帖子中。你的帖子是正确的。
猜你喜欢
  • 1970-01-01
  • 2012-03-04
  • 2010-09-13
  • 1970-01-01
  • 2012-11-27
  • 2020-04-16
  • 2012-05-06
  • 2018-07-15
相关资源
最近更新 更多