在 Grails Spring 应用程序中获取 LDAP 属性 memberof
Posted
技术标签:
【中文标题】在 Grails Spring 应用程序中获取 LDAP 属性 memberof【英文标题】:Fetching LDAP attribute memberof inside Grails Spring application 【发布时间】:2017-09-05 01:49:16 【问题描述】:我可能会遇到一个非常愚蠢的问题,尝试使用 spring-security-core 和 spring-security-ldap 插件在 Grails 应用程序(书店)中实现基于 LDAP 角色的身份验证/授权。我创建了一个自定义 UserDetailsContextMapper 并尝试将我的 LDAP 角色与应用程序角色映射。但是,memberof 属性永远不会在属性中返回。
UserDetails mapUserFromContext(DirContextOperations ctx, String username,
Collection authorities)
Attributes attributes = ctx.getAttributes();
Object[] groups = new Object[10];
groups = ctx.getObjectAttributes("memberof"); //returns empty array
Set<GrantedAuthority> authority = new HashSet<GrantedAuthority>();
for(Object group: groups)
if (group.toString().toLowerCase().contains("ROLE_FROM_LDAP".toLowerCase()) == true)
authority.add(new SimpleGrantedAuthority("ROLE_APP"));
break;
User userDetails = new User(username, "", false, false, false, false, authority);
return userDetails;
有趣的是,当我使用 ldapsearch 在 LDAP 上运行查询时,我确实得到了返回的属性。
我遇到的问题是如何在 Grails LDAP 配置中配置等效的“requesting:”(如下所示,使用 ldapsearch),以便该插件能够获取“memberof”属性(我尝试使用 ldap.search.attributesToReturn 将其添加到 Grails LDAP 插件配置,但无济于事)。
ldapsearch -t -x -b "ou=people,dc=domain,dc=com" "cn=myusername" memberof
.....
# LDAPv3
# base <ou=people,dc=domain,dc=com> with scope subtree
# filter: cn=myusername
# requesting: memberof
#
.....
dn: cn=myusername,ou=people,dc=domain,dc=com
memberOf: cn=ROLE_FROM_LDAP,ou=groups,dc=domain,dc=com
以下是 Grails LDAP 配置:
grails
plugin
springsecurity
providerNames: ['ldapAuthProvider', 'anonymousAuthenticationProvider']
ldap
useRememberMe = false
context
managerDn = 'cn=manager,dc=domain,dc=com'
managerPassword = 'secret'
server = 'ldap://localhost:389/'
search
base = 'ou=people,dc=domain,dc=com'
filter = 'cn=0'
searchSubtree = true
attributesToReturn: ['memberOf'] //extra attributes you want returned
auth
hideUserNotFoundExceptions = false
authorities
retrieveDatabaseRoles = false
retrieveGroupRoles = true
groupSearchBase = 'ou=groups,dc=domain,dc=com'
groupSearchFilter = 'member=0'
【问题讨论】:
【参考方案1】:你可以注入 springSecurityService 并获取如下:
springSecurityService.getPrincipal().getAuthorities()
【讨论】:
感谢 Mike 的帮助,事实上,在 mapUserFromContext 回调中可用的收集权限包含权限对象。但是,我最初的问题仍然是如何通过 Grails 插件配置查询“memberof”属性,因为查询是通过 ldapsearch 工作的。以上是关于在 Grails Spring 应用程序中获取 LDAP 属性 memberof的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JOSSO 和 Spring Security 从 Grails 应用程序中的 LDAP 获取自定义属性?
如何使用 spring-security-rest:1.4.0.RC5 在 grails 中获取 facebook 用户的联系人列表
如何在Grails 2单元测试中获取spring security提供的currentUser
如何使用spring security在grails中获取所有当前登录用户的列表(包括rememberme cookie)