Skip to content

Commit 48531c4

Browse files
fix: ldap user login
1 parent e2450b2 commit 48531c4

File tree

4 files changed

+58
-4
lines changed

4 files changed

+58
-4
lines changed

server/src/main/java/datart/server/service/BaseCRUDService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ default boolean unarchive(String id) {
120120
E instance = getEntityInstance();
121121
instance.setId(id);
122122
try {
123-
Method setStatus = entity.getClass().getDeclaredMethod("setStatus", Byte.class);
123+
Method setStatus = entity.getClass().getMethod("setStatus", Byte.class);
124124
setStatus.invoke(instance, Const.DATA_STATUS_ACTIVE);
125125
getDefaultMapper().updateByPrimaryKeySelective(instance);
126126
} catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException e) {

server/src/main/java/datart/server/service/impl/ExternalRegisterServiceImpl.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
import com.alibaba.fastjson.JSONObject;
2222
import com.jayway.jsonpath.JsonPath;
23+
import datart.core.base.exception.Exceptions;
24+
import datart.core.base.exception.ParamException;
2325
import datart.core.entity.User;
2426
import datart.core.mappers.ext.UserMapperExt;
2527
import datart.security.base.PasswordToken;
@@ -28,9 +30,12 @@
2830
import datart.server.service.ExternalRegisterService;
2931
import datart.server.service.UserService;
3032
import lombok.extern.slf4j.Slf4j;
33+
import org.apache.commons.lang3.RandomStringUtils;
34+
import org.apache.commons.lang3.StringUtils;
3135
import org.springframework.beans.factory.annotation.Autowired;
3236
import org.springframework.ldap.core.LdapTemplate;
3337
import org.springframework.ldap.query.LdapQueryBuilder;
38+
import org.springframework.security.crypto.bcrypt.BCrypt;
3439
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
3540
import org.springframework.security.oauth2.core.user.OAuth2User;
3641
import org.springframework.stereotype.Service;
@@ -68,6 +73,15 @@ public String ldapRegister(String filter, String password) throws MessagingExcep
6873
} catch (Exception e) {
6974
return null;
7075
}
76+
77+
User user = userMapper.selectByNameOrEmail(filter);
78+
if (user != null) {
79+
PasswordToken passwordToken = new PasswordToken(user.getUsername(),
80+
user.getPassword(),
81+
System.currentTimeMillis());
82+
return JwtUtils.toJwtString(passwordToken);
83+
}
84+
7185
String email = null;
7286

7387
try {
@@ -76,9 +90,13 @@ public String ldapRegister(String filter, String password) throws MessagingExcep
7690
} catch (Exception ignored) {
7791
}
7892

93+
if (StringUtils.isBlank(email)) {
94+
Exceptions.tr(ParamException.class, "error.param.empty", "resource.user.email");
95+
}
96+
7997
UserRegisterParam registerParam = new UserRegisterParam();
8098
registerParam.setUsername(filter);
81-
registerParam.setPassword(password);
99+
registerParam.setPassword(BCrypt.hashpw(RandomStringUtils.randomAscii(32), BCrypt.gensalt()));
82100
registerParam.setEmail(email);
83101

84102
if (userService.register(registerParam, false)) {
@@ -109,7 +127,7 @@ public String oauth2Register(OAuth2AuthenticationToken oauthAuthToken) throws Me
109127

110128
UserRegisterParam userRegisterParam = new UserRegisterParam();
111129
userRegisterParam.setUsername(oauthUser.getName());
112-
userRegisterParam.setPassword(oauthUser.getName());
130+
userRegisterParam.setPassword(BCrypt.hashpw(RandomStringUtils.randomAscii(32), BCrypt.gensalt()));
113131
if (emailMapping != null) {
114132
userRegisterParam.setEmail(JsonPath.read(jsonObj, emailMapping));
115133
}

server/src/main/java/datart/server/service/impl/UserServiceImpl.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,12 +276,38 @@ public boolean updateAvatar(String path) {
276276

277277
@Override
278278
public String login(PasswordToken passwordToken) {
279-
securityManager.login(passwordToken);
279+
try {
280+
securityManager.login(passwordToken);
281+
} catch (Exception e) {
282+
String tokenStr = ldapLogin(passwordToken);
283+
if (StringUtils.isNotBlank(tokenStr)) {
284+
return tokenStr;
285+
}
286+
log.error("Login error ({} {})", passwordToken.getSubject(), passwordToken.getPassword());
287+
Exceptions.msg("login.fail");
288+
return null;
289+
}
280290
User user = userMapper.selectByNameOrEmail(passwordToken.getSubject());
281291
passwordToken.setPassword(user.getPassword());
282292
return JwtUtils.toJwtString(passwordToken);
283293
}
284294

295+
private String ldapLogin(PasswordToken passwordToken) {
296+
String token = "";
297+
try {
298+
log.info("try to login with ldap ({}).", passwordToken.getSubject());
299+
ExternalRegisterService externalRegisterService = Application.getBean(ExternalRegisterService.class);
300+
token = externalRegisterService.ldapRegister(passwordToken.getSubject(), passwordToken.getPassword());
301+
if (StringUtils.isNotBlank(token)) {
302+
securityManager.login(token);
303+
}
304+
} catch (Exception e) {
305+
Exceptions.e(e);
306+
}
307+
return token;
308+
}
309+
310+
285311
@Override
286312
public String forgetPassword(UserIdentityType type, String principal) {
287313
User user = null;

server/src/main/resources/db/migration/V2022.03.14__1.0.0.beta.3.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,16 @@ ALTER TABLE `variable`
4949
ALTER TABLE `variable`
5050
ADD INDEX `source_id`(`source_id`) USING BTREE;
5151

52+
DELETE FROM `source_schemas`
53+
WHERE id IN
54+
(SELECT temp.id FROM (
55+
SELECT id FROM `source_schemas`
56+
WHERE source_id IN
57+
(SELECT source_id FROM `source_schemas` GROUP BY source_id HAVING count(*) > 1)
58+
AND id NOT IN
59+
(SELECT max(id) FROM `source_schemas` GROUP BY source_id HAVING count(*) > 1)
60+
) temp );
61+
5262
ALTER TABLE `source_schemas`
5363
ADD UNIQUE INDEX `source_id`(`source_id`) USING BTREE;
5464

0 commit comments

Comments
 (0)