Prohibiting login after account expiration#
The AccountExpiresCheck
procedure uses the accountExpires
attribute to decide whether a user has access to the application. For this procedure to work, you must create an attribute accountExpires
with the type string (String
). In this attribute it is necessary to store the date (in the format yyyy-MM-dd HH:mm
, for example 2021-09-23 13:58
), after which the access to the application will be blocked for this user. If the attribute value is not specified, the user will be allowed to enter the application.
public class AccountExpiresCheck implements Strategy {
private final Logger logger = LoggerFactory.getLogger("com.identityblitz.idp.flow.dynamic");
@Override public StrategyBeginState begin(final Context ctx) {
if ("login".equals(ctx.prompt())){
List<String> methods = new ArrayList<String>(Arrays.asList(ctx.availableMethods()));
methods.remove("cls");
return StrategyState.MORE(methods.toArray(new String[0]), true);
} else {
if(ctx.claims("subjectId") != null)
return StrategyState.ENOUGH();
else
return StrategyState.MORE(new String[]{});
}
}
@Override public StrategyState next(final Context ctx) {
if (ctx.claims("accountExpires") != null && isExpired(ctx.claims("accountExpires")))
return StrategyState.DENY("account_expired", true);
Integer reqFactor = (ctx.user() == null) ? null : ctx.user().requiredFactor();
if(reqFactor == null || reqFactor == ctx.justCompletedFactor())
return StrategyState.ENOUGH();
else
return StrategyState.MORE(new String[]{});
}
public static boolean isExpired(String strData) {
try {
Date now = new Date();
Date date = new SimpleDateFormat("yyyy-M-d HH:mm").parse(strData);
return now.after(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}