Expandir minha barra de realizações na Comunidade.

Enhance your AEM Assets & Boost Your Development: [AEM Gems | June 19, 2024] Improving the Developer Experience with New APIs and Events
SOLUCIONADO

Cannot disable users with disable(String reason) method

Avatar

Level 4

Dear community,

I'd like to block users from login with user.disable("reason") method in my Servlet under certain condition.

I could read/write user properties, but the disable part doesn't work and I could still login with this user.

YuSheng_0-1671616176061.png

(code snippet attached below)

 

Did I miss something important to make it work?

Thanks a lot! 

 

UserManager userManager = ((JackrabbitSession) session).getUserManager();
Authorizable userAuth = userManager.getAuthorizable(userId);
User user = (User) userManager.getAuthorizable(userId);

if (userAuth != null) {

	int totalCount = 1;
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	Value[] userPropertyValueArray = userAuth.getProperty("profile/loginAttemptCount");

	if (userPropertyValueArray != null) {
		int userFailureLoginCount = Integer.parseInt(userPropertyValueArray[0].toString());

		if (userFailureLoginCount == 5) {						
			Date nowTime = new Date();						
			long time = 15 * 60 * 1000;
			Date lockUntil = new Date(nowTime.getTime() + time);
			userAuth.setProperty("profile/lockUntil",
					session.getValueFactory().createValue(sdf.format(lockUntil)));
			user.disable("Reach failure login limit");
			return;
			
		} else {
			totalCount = userFailureLoginCount + 1;
			userAuth.setProperty("profile/loginAttemptCount", session.getValueFactory().createValue(totalCount));
		}
	}
	
	userAuth.setProperty("profile/loginAttemptTimestamp",
			session.getValueFactory().createValue(sdf.format(new Date())));
}

session.save();
session.logout();

 

Tópicos

Os tópicos ajudam a categorizar o conteúdo da comunidade e aumentam sua capacidade de descobrir conteúdo relevante.

1 Solução aceita

Avatar

Resposta correta de
Community Advisor

Hi @YuSheng,

I did a quick check of disabled method usage and it worked fine on my end. In general it sets rep:disabled property with string value I have passed as an argument. This is a sample code.

 

 

UserManager userManager = ((JackrabbitSession) session).getUserManager();
User user = (User) userManager.getAuthorizable("test");
user.disable("Reach failure login limit");
session.save();

 

 

I see one problem in your implementation, in below part of your code

 

 

		if (userFailureLoginCount == 5) {						
			Date nowTime = new Date();						
			long time = 15 * 60 * 1000;
			Date lockUntil = new Date(nowTime.getTime() + time);
			userAuth.setProperty("profile/lockUntil",
					session.getValueFactory().createValue(sdf.format(lockUntil)));
			user.disable("Reach failure login limit");
			return;
			
		} 

 

 

You are using return statement before you saved your changes, this is why user account is not disabled.

Please remove return statement from the body of above if condition block, or add session.save before return. In other words currently you are not saving changes you did.

Your code could look like below

 

 

if (userFailureLoginCount == 5) {						
  Date nowTime = new Date();						
  long time = 15 * 60 * 1000;
  Date lockUntil = new Date(nowTime.getTime() + time);
  userAuth.setProperty("profile/lockUntil",			session.getValueFactory().createValue(sdf.format(lockUntil)));
  user.disable("Reach failure login limit");
  session.save();
  return;
} 

 

 

or like that

 

 

if (userFailureLoginCount == 5) {						
  Date nowTime = new Date();						
  long time = 15 * 60 * 1000;
  Date lockUntil = new Date(nowTime.getTime() + time);
  userAuth.setProperty("profile/lockUntil",			session.getValueFactory().createValue(sdf.format(lockUntil)));
  user.disable("Reach failure login limit");
} 

 

 

Ver solução na publicação original

4 Respostas

Avatar

Community Advisor

Avatar

Level 4

Hi @arunpatidar, thank you for the reply.

I've seen this post and it doesn't help in my case.

Simply wanna know how to make this method work since it's the most straitforward approach to prevent user from login.

YuSheng_1-1671615382468.png

Avatar

Resposta correta de
Community Advisor

Hi @YuSheng,

I did a quick check of disabled method usage and it worked fine on my end. In general it sets rep:disabled property with string value I have passed as an argument. This is a sample code.

 

 

UserManager userManager = ((JackrabbitSession) session).getUserManager();
User user = (User) userManager.getAuthorizable("test");
user.disable("Reach failure login limit");
session.save();

 

 

I see one problem in your implementation, in below part of your code

 

 

		if (userFailureLoginCount == 5) {						
			Date nowTime = new Date();						
			long time = 15 * 60 * 1000;
			Date lockUntil = new Date(nowTime.getTime() + time);
			userAuth.setProperty("profile/lockUntil",
					session.getValueFactory().createValue(sdf.format(lockUntil)));
			user.disable("Reach failure login limit");
			return;
			
		} 

 

 

You are using return statement before you saved your changes, this is why user account is not disabled.

Please remove return statement from the body of above if condition block, or add session.save before return. In other words currently you are not saving changes you did.

Your code could look like below

 

 

if (userFailureLoginCount == 5) {						
  Date nowTime = new Date();						
  long time = 15 * 60 * 1000;
  Date lockUntil = new Date(nowTime.getTime() + time);
  userAuth.setProperty("profile/lockUntil",			session.getValueFactory().createValue(sdf.format(lockUntil)));
  user.disable("Reach failure login limit");
  session.save();
  return;
} 

 

 

or like that

 

 

if (userFailureLoginCount == 5) {						
  Date nowTime = new Date();						
  long time = 15 * 60 * 1000;
  Date lockUntil = new Date(nowTime.getTime() + time);
  userAuth.setProperty("profile/lockUntil",			session.getValueFactory().createValue(sdf.format(lockUntil)));
  user.disable("Reach failure login limit");
} 

 

 

Avatar

Level 4

@lukasz-m Thanks for the reply, I check the exception when the the disable was executed and got 

"javax.jcr.AccessDeniedException: OakAccess0000: Access denied"

I think the problem is the system user I created doesn't have enough permission to execute disable.