Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add active directory support #1562

Merged
merged 4 commits into from
Oct 30, 2018
Merged

Conversation

codepiano
Copy link
Contributor

功能

现有的 ldap 实现不支持 active directory,并且需要用户自行更改代码,编译 portal,因此计划提供对 active direcotry 的支持,并且支持动态绑定,用户只需更改配置文件即可接入。

  1. 添加 ldap 对 active directory 的支持
  2. 通过配置更改 ldap 属性绑定,不用再自行编译 portal

变更

ldap 认证方式

修改了认证过程,不再通过比对密码的形式,改用 bind 形式去认证身份,流程如下:

  1. 使用配置的 ldap 管理账户调用 bind,验证管理员账户密码是否正常
  2. 使用管理员账户,根据 id,搜索要登录用户,查看用户是否存在
  3. 查询到用户以后,获得用户的 full DN
  4. 使用用户的 DN,调用 bind,去用户的密码去认证用户身份

动态绑定流程

修改了原有的查询用户方式,通过配置文件填写用户id、显示名、邮箱在 ldap 里面的对应属性,使用管理员账号,通过查询语句去获得用户的属性值。

新增功能

配置 ldap 标准的 memberOf 过滤器,只允许某些组的用户访问

配置文件说明

spring:
  ldap:
    base: "dc=example,dc=com"
    username: "admin"
    password: "passwod"
    searchFilter: "(sAMAccountName={0})"  # 用户过滤器,登录的时候用这个过滤器来搜索用户
    urls:
    - "ldap://1.1.1.1:389"

ldap:
  mapping: # 配置 ldap 属性
    objectClass: "user" # ldap 用户 objectClass 配置
    loginId: "sAMAccountName" # ldap 用户惟一 id,用来作为登录的 id
    userDisplayName: "cn" # ldap 用户名,用来作为显示名
    email: "userPrincipalName" # ldap 邮箱属性
  filter: # 配置过滤,目前只支持 memberOf
    memberOf: "CN=ServiceDEV,OU=test,DC=example,DC=com|CN=WebDEV,OU=test,DC=example,DC=com" # 只允许 memberOf 属性为 ServiceDEV 和 WebDEV 的用户访问

目前状态

active directory 的方式测试通过,已经开始使用
原始的 ldap 方式,因为没有测试环境,所以需要找人帮忙进行测试

@coveralls
Copy link

coveralls commented Oct 12, 2018

Coverage Status

Coverage increased (+0.07%) to 52.465% when pulling a0e6a98 on codepiano:ldap_support_ad into f73ded8 on ctripcorp:master.

@codecov-io
Copy link

codecov-io commented Oct 12, 2018

Codecov Report

Merging #1562 into master will increase coverage by 7.42%.
The diff coverage is n/a.

Impacted file tree graph

@@             Coverage Diff             @@
##             master   #1562      +/-   ##
===========================================
+ Coverage     48.67%   56.1%   +7.42%     
+ Complexity     1903    1063     -840     
===========================================
  Files           393     191     -202     
  Lines         11497    5647    -5850     
  Branches       1195     590     -605     
===========================================
- Hits           5596    3168    -2428     
+ Misses         5472    2238    -3234     
+ Partials        429     241     -188
Impacted Files Coverage Δ Complexity Δ
...ework/apollo/portal/controller/ItemController.java
...o/configservice/wrapper/DeferredResultWrapper.java
...omponent/emailbuilder/GrayPublishEmailBuilder.java
...k/apollo/portal/controller/FavoriteController.java
...apollo/portal/entity/vo/AppRolesAssignedUsers.java
...ponent/emailbuilder/NormalPublishEmailBuilder.java
.../framework/apollo/portal/entity/vo/SystemInfo.java
...rk/apollo/portal/service/NamespaceLockService.java
...k/apollo/portal/spi/ctrip/CtripUserInfoHolder.java
...llo/portal/listener/AppNamespaceDeletionEvent.java
... and 187 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update c601f57...815162b. Read the comment docs.

@nobodyiam
Copy link
Member

@pandalin @zchlwj

麻烦帮忙review一下吧,另外我这里也没有ldap测试环境,不知是否可以帮忙验证一下?

@pandalin
Copy link

好的,但是要稍等等,最近事情有点多

@danshan
Copy link

danshan commented Oct 18, 2018

测试可用
需要添加 vm options:

-Dapollo_profile=github,ldap

另外. 如果不加 filter 会报错.

@codepiano
Copy link
Contributor Author

测试可用
需要添加 vm options:

-Dapollo_profile=github,ldap

另外. 如果不加 filter 会报错.

感谢反馈,已经添加了默认值,可以不写 filter。

@poweryang1990
Copy link

@codepiano 测试可用, 但我认为还需要再认证完后 将用户 写入Apollo数据库中 这样 在项目创建的时候才能指定人及权限

@codepiano
Copy link
Contributor Author

@codepiano 测试可用, 但我认为还需要再认证完后 将用户 写入Apollo数据库中 这样 在项目创建的时候才能指定人及权限

创建项目的时候是可以选人的,会直接去 ldap 里面加载用户列表,如果没有加载出来,可能是哪里出了问题。

@nobodyiam
Copy link
Member

@codepiano

非常感谢,我在本地通过安装open ldap已经验证原始的 ldap 方式工作正常~

不过配置上和你的sample略有不同,比如spring.ldap.username我发现必须要填写完整才行,如cn=admin,dc=example,dc=org,所以想问一下active directory的方式只需要设置admin就可以?

spring:
  ldap:
    base: "dc=example,dc=org"
    username: "cn=admin,dc=example,dc=org"
    password: "admin"
    searchFilter: "(uid={0})"  # 用户过滤器,登录的时候用这个过滤器来搜索用户
    urls:
    - "ldap://localhost:389"

ldap:
  mapping: # 配置 ldap 属性
    objectClass: "inetOrgPerson" # ldap 用户 objectClass 配置
    loginId: "uid" # ldap 用户惟一 id,用来作为登录的 id
    userDisplayName: "cn" # ldap 用户名,用来作为显示名
    email: "mail" # ldap 邮箱属性

@codepiano
Copy link
Contributor Author

@codepiano

非常感谢,我在本地通过安装open ldap已经验证原始的 ldap 方式工作正常~

不过配置上和你的sample略有不同,比如spring.ldap.username我发现必须要填写完整才行,如cn=admin,dc=example,dc=org,所以想问一下active directory的方式只需要设置admin就可以?

spring:
  ldap:
    base: "dc=example,dc=org"
    username: "cn=admin,dc=example,dc=org"
    password: "admin"
    searchFilter: "(uid={0})"  # 用户过滤器,登录的时候用这个过滤器来搜索用户
    urls:
    - "ldap://localhost:389"

ldap:
  mapping: # 配置 ldap 属性
    objectClass: "inetOrgPerson" # ldap 用户 objectClass 配置
    loginId: "uid" # ldap 用户惟一 id,用来作为登录的 id
    userDisplayName: "cn" # ldap 用户名,用来作为显示名
    email: "mail" # ldap 邮箱属性

对,只用指用户名,我贴的配置就是我们线上使用的配置,只是修改了敏感信息

Copy link
Member

@nobodyiam nobodyiam left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@nobodyiam nobodyiam merged commit 3afbe93 into apolloconfig:master Oct 30, 2018
@codepiano
Copy link
Contributor Author

我抽空整理一个使用文档

@codepiano codepiano deleted the ldap_support_ad branch October 30, 2018 16:46
@pandalin
Copy link

pandalin commented Nov 2, 2018

good,我最初提供的版本一直在想如何更改为这种方式

@codepiano
Copy link
Contributor Author

@nobodyiam 不知文档该放到哪里?wiki 似乎没有编辑权限

@nobodyiam
Copy link
Member

目前似乎wiki不能PR。。。要不建一个issue,然后把文档贴进去?然后我再复制到wiki的相应位置。

@codepiano
Copy link
Contributor Author

好,那我就贴这个 pr 的评论里吧

@deanjo
Copy link

deanjo commented Nov 27, 2018

功能

现有的 ldap 实现不支持 active directory,并且需要用户自行更改代码,编译 portal,因此计划提供对 active direcotry 的支持,并且支持动态绑定,用户只需更改配置文件即可接入。

  1. 添加 ldap 对 active directory 的支持
  2. 通过配置更改 ldap 属性绑定,不用再自行编译 portal

变更

ldap 认证方式

修改了认证过程,不再通过比对密码的形式,改用 bind 形式去认证身份,流程如下:

  1. 使用配置的 ldap 管理账户调用 bind,验证管理员账户密码是否正常
  2. 使用管理员账户,根据 id,搜索要登录用户,查看用户是否存在
  3. 查询到用户以后,获得用户的 full DN
  4. 使用用户的 DN,调用 bind,去用户的密码去认证用户身份

动态绑定流程

修改了原有的查询用户方式,通过配置文件填写用户id、显示名、邮箱在 ldap 里面的对应属性,使用管理员账号,通过查询语句去获得用户的属性值。

新增功能

配置 ldap 标准的 memberOf 过滤器,只允许某些组的用户访问

配置文件说明

spring:
  ldap:
    base: "dc=example,dc=com"
    username: "admin"
    password: "passwod"
    searchFilter: "(sAMAccountName={0})"  # 用户过滤器,登录的时候用这个过滤器来搜索用户
    urls:
    - "ldap://1.1.1.1:389"

ldap:
  mapping: # 配置 ldap 属性
    objectClass: "user" # ldap 用户 objectClass 配置
    loginId: "sAMAccountName" # ldap 用户惟一 id,用来作为登录的 id
    userDisplayName: "cn" # ldap 用户名,用来作为显示名
    email: "userPrincipalName" # ldap 邮箱属性
  filter: # 配置过滤,目前只支持 memberOf
    memberOf: "CN=ServiceDEV,OU=test,DC=example,DC=com|CN=WebDEV,OU=test,DC=example,DC=com" # 只允许 memberOf 属性为 ServiceDEV 和 WebDEV 的用户访问

目前状态

active directory 的方式测试通过,已经开始使用
原始的 ldap 方式,因为没有测试环境,所以需要找人帮忙进行测试

请问按照这种方式接入ladp
能支持apollo的权限体系吗

@nobodyiam
Copy link
Member

@Dean-hu 可以的

@nobodyiam nobodyiam mentioned this pull request Dec 6, 2018
@peilongshi
Copy link

配置了openldap方式之后,原先的apollo/admin就登录不上了吗?

@nobodyiam
Copy link
Member

在ldap中创建这个apollo/admin用户就可以了

@bei0228-l
Copy link

@codepiano 测试可用, 但我认为还需要再认证完后 将用户 写入Apollo数据库中 这样 在项目创建的时候才能指定人及权限

我现在用的apollo1.3配置我们单位的ldap服务,用的active Directory方式配置Ldap,可以登录,但是在创建项目的时候应用负责人列表为空,不知道您知道怎么解决的么,我看你说的貌似也是这个问题

@bei0228-l
Copy link

@codepiano 测试可用, 但我认为还需要再认证完后 将用户 写入Apollo数据库中 这样 在项目创建的时候才能指定人及权限

创建项目的时候是可以选人的,会直接去 ldap 里面加载用户列表,如果没有加载出来,可能是哪里出了问题。

我现在就是遇到了这个问题,我目前用的1.3apollo,配置我单位的ldap服务,用的是active Directory方式 配置的memberOf形式接入,可以登陆,但是在创建项目的时候应用负责人列表无法加载,请问您有相关问题处理经验没

@nobodyiam
Copy link
Member

@bei0228-l 看描述可能是memberOf配置有问题,可以尝试先把filter配置去掉试试

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

10 participants