ldap插件和restapi插件,ldap登录实现方式不一致。

cuba版本:7.1.1
ldap 版本:1.4.0
配置是:
app.properties
ldap.contextSourceUrl = ldap://XX.XX.XX.XXX:XXX
ldap.contextSourceBase = dc=XXX,dc=XXXX
ldap.contextSourceUserName = XXXX
ldap.contextSourcePassword = XXXXX
ldap.referral = follow
ldap.sessionExpiringPeriodSec = 120
ldap.userSynchronizationBatchSize = 100
ldap.userSynchronizationOnlyActiveProperty = true
ldap.cubaGroupForSynchronization = Company
ldap.cubaGroupForSynchronizationInverse = false
ldap.synchronizeCommonInfoFromLdap = true
cuba.web.standardAuthenticationUsers = admin,anonymous

web-app.properties
cuba.web.standardAuthenticationUsers = admin,anonymous
ldap.expiringSessionNotificationCron = */10 * * * * *
ldap.addonEnabled = true
ldap.expiringSessionsEnable = true
cuba.rest.standardAuthenticationEnabled = false
cuba.rest.ldap.enabled = true
cuba.rest.ldap.urls = ldap://XX.XX.XX.XXX:XXX
cuba.rest.ldap.base = dc=XXX,dc=XXXX
cuba.rest.ldap.user = XXX
cuba.rest.ldap.password = XXXX
现象:
1.先使用web页面进行ldap用户登录,可以正常登录,ldap用户正常同步到本地数据库。
再使用restpai登录用户,登录成功。
2.不使用web页面进行ldap用户登录,直接使用restpai登录用户,登录失败,提示本地没有此用户。
分析:
通过查看代码,发现两边实现方式不一致。
web侧在ldap用户登录时,会先进行ldap用户是否正确的check,然后执行dap_UserSynchronizationSchedulerService.synchronizeUsersFromLdap()方法,将ldap用户复制到本地数据库。
restapi在检查ldap用户是否正确后,不进行用户的同步,直接查找本地用户,导致登录失败。

使用 API 的话,需要开启定时任务同步用户。或者先调用同步用户的 API 再调用登录的 API。

定时同步只是将已经同步到本地的用户和ldap服务器进行同步.
如果两边都实现一样的业务,我觉得是比较好的.

能否提供一下使用 API 登录的示例代码?

文档地址:https://doc.cuba-platform.com/restapi-7.1/?_ga=2.87691931.2035008016.1573311789-2020995235.1555427770#rest_api_v2_ldap

获取token路径:
http://localhost:8080/app/rest/v2/ldap/token

不是不是,是需要你提供一段你使用 api 登录的代码

我使用的是postmen进行登录的。
url:http://localhost:8080/app/rest/v2/ldap/token
问题代码位置:\restapi\modules\rest-api\src\com\haulmont\addon\restapi\api\ldap\LdapAuthController.java
方法:protected OAuthTokenIssuer.OAuth2AccessTokenResult authenticate(String username, String password, Locale locale, String ipAddress, Map<String, String> parameters)
逻辑:
当if (!ldapTemplate.authenticate(LdapUtils.emptyLdapName(), buildPersonFilter(username), password))判断用户已经通过了ldap验证后,没有进行用户同步,直接进行了本地用户查找。