[New] Allow case insensitive usernames in privilege

This commit is contained in:
Robert von Burg 2020-09-25 17:19:22 +02:00
parent eb702466bf
commit 74a0c5f8a4
2 changed files with 19 additions and 7 deletions

View File

@ -171,6 +171,11 @@ public interface PrivilegeHandler {
*/ */
String PARAM_ALLOW_SESSION_REFRESH = "allowSessionRefresh"; //$NON-NLS-1$ String PARAM_ALLOW_SESSION_REFRESH = "allowSessionRefresh"; //$NON-NLS-1$
/**
* configuration parameter to define if username is case insensitive
*/
String PARAM_CASE_INSENSITIVE_USERNAME = "caseInsensitiveUsername"; //$NON-NLS-1$
/** /**
* configuration parameter to define a secret salt * configuration parameter to define a secret salt
*/ */

View File

@ -15,6 +15,7 @@
*/ */
package li.strolch.privilege.handler; package li.strolch.privilege.handler;
import static li.strolch.privilege.handler.PrivilegeHandler.PARAM_CASE_INSENSITIVE_USERNAME;
import static li.strolch.privilege.helper.XmlConstants.*; import static li.strolch.privilege.helper.XmlConstants.*;
import static li.strolch.utils.helper.StringHelper.formatNanoDuration; import static li.strolch.utils.helper.StringHelper.formatNanoDuration;
@ -58,6 +59,8 @@ public class XmlPersistenceHandler implements PersistenceHandler {
private File usersPath; private File usersPath;
private File rolesPath; private File rolesPath;
private boolean caseInsensitiveUsername;
@Override @Override
public Map<String, String> getParameterMap() { public Map<String, String> getParameterMap() {
return this.parameterMap; return this.parameterMap;
@ -79,7 +82,7 @@ public class XmlPersistenceHandler implements PersistenceHandler {
@Override @Override
public User getUser(String username) { public User getUser(String username) {
return this.userMap.get(username); return this.userMap.get(this.caseInsensitiveUsername ? username.toLowerCase() : username);
} }
@Override @Override
@ -89,7 +92,7 @@ public class XmlPersistenceHandler implements PersistenceHandler {
@Override @Override
public User removeUser(String username) { public User removeUser(String username) {
User user = this.userMap.remove(username); User user = this.userMap.remove(this.caseInsensitiveUsername ? username.toLowerCase() : username);
this.userMapDirty = user != null; this.userMapDirty = user != null;
return user; return user;
} }
@ -103,7 +106,8 @@ public class XmlPersistenceHandler implements PersistenceHandler {
@Override @Override
public void addUser(User user) { public void addUser(User user) {
if (this.userMap.containsKey(user.getUsername())) if (this.userMap
.containsKey(this.caseInsensitiveUsername ? user.getUsername().toLowerCase() : user.getUsername()))
throw new IllegalStateException(MessageFormat.format("The user {0} already exists!", user.getUsername())); throw new IllegalStateException(MessageFormat.format("The user {0} already exists!", user.getUsername()));
this.userMap.put(user.getUsername(), user); this.userMap.put(user.getUsername(), user);
this.userMapDirty = true; this.userMapDirty = true;
@ -145,7 +149,7 @@ public class XmlPersistenceHandler implements PersistenceHandler {
*/ */
@Override @Override
public void initialize(Map<String, String> paramsMap) { public void initialize(Map<String, String> paramsMap) {
this.parameterMap = Collections.unmodifiableMap(new HashMap<>(paramsMap)); this.parameterMap = Map.copyOf(paramsMap);
// get and validate base bath // get and validate base bath
String basePath = this.parameterMap.get(XML_PARAM_BASE_PATH); String basePath = this.parameterMap.get(XML_PARAM_BASE_PATH);
@ -197,6 +201,8 @@ public class XmlPersistenceHandler implements PersistenceHandler {
this.usersPath = usersPath; this.usersPath = usersPath;
this.rolesPath = rolesPath; this.rolesPath = rolesPath;
this.caseInsensitiveUsername = Boolean.parseBoolean(this.parameterMap.get(PARAM_CASE_INSENSITIVE_USERNAME));
if (reload()) if (reload())
logger.info("Privilege Data loaded."); //$NON-NLS-1$ logger.info("Privilege Data loaded."); //$NON-NLS-1$
} }
@ -210,8 +216,8 @@ public class XmlPersistenceHandler implements PersistenceHandler {
@Override @Override
public boolean reload() { public boolean reload() {
this.roleMap = Collections.synchronizedMap(new HashMap<String, Role>()); this.roleMap = Collections.synchronizedMap(new HashMap<>());
this.userMap = Collections.synchronizedMap(new HashMap<String, User>()); this.userMap = Collections.synchronizedMap(new HashMap<>());
// parse models xml file to XML document // parse models xml file to XML document
PrivilegeUsersSaxReader usersXmlHandler = new PrivilegeUsersSaxReader(); PrivilegeUsersSaxReader usersXmlHandler = new PrivilegeUsersSaxReader();
@ -232,7 +238,8 @@ public class XmlPersistenceHandler implements PersistenceHandler {
// USERS // USERS
List<User> users = usersXmlHandler.getUsers(); List<User> users = usersXmlHandler.getUsers();
for (User user : users) { for (User user : users) {
this.userMap.put(user.getUsername(), user); this.userMap
.put(this.caseInsensitiveUsername ? user.getUsername().toLowerCase() : user.getUsername(), user);
} }
this.userMapDirty = false; this.userMapDirty = false;