thingsboard-developers

Merge pull request #1247 from mp-loki/case-insensitive-login Added

11/15/2018 4:47:07 PM

Details

diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml
index aee49f6..c18c2f1 100644
--- a/application/src/main/resources/thingsboard.yml
+++ b/application/src/main/resources/thingsboard.yml
@@ -99,6 +99,8 @@ security:
     tokenSigningKey: "${JWT_TOKEN_SIGNING_KEY:thingsboardDefaultSigningKey}"
   # Enable/disable access to Tenant Administrators JWT token by System Administrator or Customer Users JWT token by Tenant Administrator
   user_token_access_enabled: "${SECURITY_USER_TOKEN_ACCESS_ENABLED:true}"
+  # Enable/disable case-sensitive username login
+  user_login_case_sensitive: "${SECURITY_USER_LOGIN_CASE_SENSITIVE:true}"
 
 # Dashboard parameters
 dashboard:
diff --git a/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java
index 8e283b5..cf8282e 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/user/UserServiceImpl.java
@@ -20,6 +20,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.thingsboard.server.common.data.Customer;
 import org.thingsboard.server.common.data.Tenant;
@@ -54,6 +55,9 @@ public class UserServiceImpl extends AbstractEntityService implements UserServic
     public static final String INCORRECT_USER_ID = "Incorrect userId ";
     public static final String INCORRECT_TENANT_ID = "Incorrect tenantId ";
 
+    @Value("${security.user_login_case_sensitive:true}")
+    private boolean userLoginCaseSensitive;
+
     @Autowired
     private UserDao userDao;
 
@@ -70,7 +74,11 @@ public class UserServiceImpl extends AbstractEntityService implements UserServic
     public User findUserByEmail(TenantId tenantId, String email) {
         log.trace("Executing findUserByEmail [{}]", email);
         validateString(email, "Incorrect email " + email);
-        return userDao.findByEmail(tenantId, email);
+        if (userLoginCaseSensitive) {
+            return userDao.findByEmail(tenantId, email);
+        } else {
+            return userDao.findByEmail(tenantId, email.toLowerCase());
+        }
     }
 
     @Override
@@ -91,6 +99,9 @@ public class UserServiceImpl extends AbstractEntityService implements UserServic
     public User saveUser(User user) {
         log.trace("Executing saveUser [{}]", user);
         userValidator.validate(user, User::getTenantId);
+        if (user.getId() == null && !userLoginCaseSensitive) {
+            user.setEmail(user.getEmail().toLowerCase());
+        }
         User savedUser = userDao.save(user.getTenantId(), user);
         if (user.getId() == null) {
             UserCredentials userCredentials = new UserCredentials();
diff --git a/dao/src/test/resources/application-test.properties b/dao/src/test/resources/application-test.properties
index 3bd0f7d..a285676 100644
--- a/dao/src/test/resources/application-test.properties
+++ b/dao/src/test/resources/application-test.properties
@@ -35,4 +35,6 @@ redis.connection.port=6379
 redis.connection.db=0
 redis.connection.password=
 
+security.user_login_case_sensitive=true
+
 database.ts_max_intervals=700
\ No newline at end of file