Вход только при определенном значении атрибута#
Процедура AccessByAttribute
использует атрибут appList
для
принятия решения о доступе пользователя к приложению. Для работы этой
процедуры необходимо создать атрибут appList
в виде массива
(Array of strings
). В качестве значений элементов этого массива
следует использовать идентификаторы приложений. В результате доступ к
приложению будет предоставлен, если среди значений appList
у данного
пользователя будет идентификатор этого приложения. Такая архитектура
процедуры позволяет назначить ее сразу нескольким приложениям и
регулировать доступ к ним при помощи одного атрибута.
public class AccessByAttribute implements Strategy {
private final Logger logger = LoggerFactory.getLogger("com.identityblitz.idp.flow.dynamic");
@Override public StrategyBeginState begin(final Context ctx) {
if(ctx.claims("subjectId") != null){
int appListIdx = 0;
boolean hasAccess = false;
while (appListIdx > -1) {
String app = ctx.claims("appList.[" + appListIdx + "]");
logger.debug("app [" + appListIdx + "] = " + app);
if (app == null){ appListIdx = -1; }
else if (app.equals(ctx.appId())) { appListIdx = -1; hasAccess = true; }
else { appListIdx ++; logger.debug("AppList index = " + appListIdx); }
}
if(hasAccess)
return StrategyState.ENOUGH();
else
return StrategyState.DENY;
}
else
return StrategyState.MORE(new String[]{});
}
@Override public StrategyState next(final Context ctx) {
int appListIdx = 0;
boolean hasAccess = false;
while (appListIdx > -1) {
String app = ctx.claims("appList.[" + appListIdx + "]");
logger.debug("app [" + appListIdx + "] = " + app);
if (app == null){ appListIdx = -1; }
else if (app.equals(ctx.appId())) { appListIdx = -1; hasAccess = true; }
else { appListIdx ++; logger.debug("AppList index = " + appListIdx); }
}
if(!hasAccess)
return StrategyState.DENY;
Integer reqFactor = 0;
if (ctx.user() != null) {
reqFactor = ctx.user().requiredFactor();
}
if (reqFactor == 0)
return StrategyState.ENOUGH();
else {
if (reqFactor == ctx.justCompletedFactor())
return StrategyState.ENOUGH();
else
return StrategyState.MORE(new String[]{});
}
}
}
Пример упрощенного варианта процедуры – допуск пользователя в приложение
при условии, что адрес его электронной почты равен
ivanov@company.ru
:
@Override public StrategyBeginState begin(final Context ctx) {
if(ctx.claims("subjectId") != null){
if("ivanov@company.ru".equals(ctx.claims("email")))
return StrategyState.ENOUGH();
else
return StrategyState.DENY;
}
else
return StrategyState.MORE(new String[]{});
}
@Override public StrategyState next(final Context ctx) {
if(!"ivanov@company.ru".equals(ctx.claims("email")))
return StrategyState.DENY;
Integer reqFactor = (ctx.user() == null) ? null : ctx.user().requiredFactor();
if(reqFactor == null)
return StrategyState.ENOUGH();
else {
if(reqFactor == ctx.justCompletedFactor())
return StrategyState.ENOUGH();
else
return StrategyState.MORE(new String[]{});
}
}