我有一个使用Java Spring MVC构建的Web应用程序。
我只是设置连接到LDAP服务器的spring security以进行身份验证。
我已成功设置它以便我能够登录到我的应用程序但是我找不到任何可以帮助我将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,以便用户可以看到整个Web应用程序。
我似乎只能找到非常简单的示例,其中组是ADMIN或USER,在这种情况下,前缀ROLE刚刚添加到组中,或者其他方法似乎使用UserDetailContextMapper但我无法找到明确地使用这个。
答案 0 :(得分:7)
为此,我在身份验证管理器中使用了以下内容:
user-context-mapper-ref="customUserContextMapper"
然后我使用以下类来检查该用户是否属于某个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;
}
请注意,由于我连接的LDAP服务器具有与通常不同的结构,因此用户可以访问的组存储在用户下的属性中,而不是换句话说,一个组将属于它的所有用户作为属性。