如何将 AD 组映射到用户角色 Spring 安全 LDAP
How to Map AD Groups to User Role Spring Security LDAP
我有一个使用 Java Spring MVC 构建的 Web 应用程序。
我正在设置 spring 安全连接到 LDAP 服务器以进行身份验证。
我已成功设置它,因此我可以登录到我的应用程序,但我找不到任何东西可以帮助我将 AD 组映射到 Java 中的用户角色只得到一个 403 禁止访问的页面,即我已经通过身份验证但还没有权限。
我目前有:
<http auto-config="true">
<intercept-url pattern="/**" access="ROLE_USER" />
</http>
<ldap-server id="ldapServer" url="LDAPURL" manager-dn="USER" manager-password="PASSWORD" />
<authentication-manager >
<ldap-authentication-provider
group-search-base="OU=GROUPS"
group-search-filter="sAMAccountName={0}"
user-search-base="OU=USERS"
user-search-filter="sAMAccountName={0}"
/>
</authentication-manager>
假设该用户是 AD 组 g-group-UK-user 的一部分,然后我希望能够将该 AD 组映射到 ROLE_USER,这样用户就可以看到整个网络应用程序。
我似乎只能找到非常简单的示例,其中组是 ADMIN 或 USER,在这种情况下,前缀 ROLE 只是添加到组中,或者其他方法似乎正在使用 UserDetailContextMapper 但我找不到明确使用这个。
为此,我在身份验证管理器中使用了以下内容:
user-context-mapper-ref="customUserContextMapper"
然后我使用以下class检查该用户是否属于某个AD组,然后将ROLE_USER角色分配给他们的权限:
@Override
public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<? extends GrantedAuthority> authorities)
{
Attributes attributes = ctx.getAttributes();
Object[] groups = new Object[100];
groups = ctx.getObjectAttributes("memberOf");
LOGGER.debug("Attributes: {}", attributes);
Set<GrantedAuthority> authority = new HashSet<GrantedAuthority>();
for(Object group: groups)
{
if (group.toString().toLowerCase().contains("AD_GROUP_NAME".toLowerCase()) == true)
{
authority.add(new SimpleGrantedAuthority("ROLE_USER"));
break;
}
}
User userDetails = new User(username, "", false, false, false, false, authority);
return userDetails;
}
请注意 class 比平常稍微复杂一些,因为我连接的 LDAP 服务器的结构与平常不同,因为用户有权访问的组存储在一个属性中在用户下,而不是相反,在这种情况下,一个组会将属于它的所有用户作为一个属性。
我有一个使用 Java Spring MVC 构建的 Web 应用程序。
我正在设置 spring 安全连接到 LDAP 服务器以进行身份验证。
我已成功设置它,因此我可以登录到我的应用程序,但我找不到任何东西可以帮助我将 AD 组映射到 Java 中的用户角色只得到一个 403 禁止访问的页面,即我已经通过身份验证但还没有权限。
我目前有:
<http auto-config="true">
<intercept-url pattern="/**" access="ROLE_USER" />
</http>
<ldap-server id="ldapServer" url="LDAPURL" manager-dn="USER" manager-password="PASSWORD" />
<authentication-manager >
<ldap-authentication-provider
group-search-base="OU=GROUPS"
group-search-filter="sAMAccountName={0}"
user-search-base="OU=USERS"
user-search-filter="sAMAccountName={0}"
/>
</authentication-manager>
假设该用户是 AD 组 g-group-UK-user 的一部分,然后我希望能够将该 AD 组映射到 ROLE_USER,这样用户就可以看到整个网络应用程序。
我似乎只能找到非常简单的示例,其中组是 ADMIN 或 USER,在这种情况下,前缀 ROLE 只是添加到组中,或者其他方法似乎正在使用 UserDetailContextMapper 但我找不到明确使用这个。
为此,我在身份验证管理器中使用了以下内容:
user-context-mapper-ref="customUserContextMapper"
然后我使用以下class检查该用户是否属于某个AD组,然后将ROLE_USER角色分配给他们的权限:
@Override
public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<? extends GrantedAuthority> authorities)
{
Attributes attributes = ctx.getAttributes();
Object[] groups = new Object[100];
groups = ctx.getObjectAttributes("memberOf");
LOGGER.debug("Attributes: {}", attributes);
Set<GrantedAuthority> authority = new HashSet<GrantedAuthority>();
for(Object group: groups)
{
if (group.toString().toLowerCase().contains("AD_GROUP_NAME".toLowerCase()) == true)
{
authority.add(new SimpleGrantedAuthority("ROLE_USER"));
break;
}
}
User userDetails = new User(username, "", false, false, false, false, authority);
return userDetails;
}
请注意 class 比平常稍微复杂一些,因为我连接的 LDAP 服务器的结构与平常不同,因为用户有权访问的组存储在一个属性中在用户下,而不是相反,在这种情况下,一个组会将属于它的所有用户作为一个属性。