Получение геоданных пользователя#
Процедуру входа можно использовать для получения данных о стране и городе, в которых находится пользователь, и на основании этого гибко настраивать правила входа, например, вводить запрет на вход из-за рубежа, активировать второй фактор аутентификации и др.
Для этого в процедурах входа используйте следующие классы и методы:
Класс
LGeoData
c функциямиgetCountry()
иgetCity()
.public class LGeoData { /** * Get IP address country * * @return - country or null if country not specified. */ public final String getCountry(); /** * Get IP address city * * @return - city or null if city not specified. */ public final String getCity(); }
Метод
geoData()
вContext
./** * Get geo data of user IP address * * @return - geo data. */ LGeoData geoData();
Важно
Для работы метода необходимо импортировать класс
LGeoData
.import com.identityblitz.idp.login.authn.flow.LGeoData
import com.identityblitz.idp.login.authn.flow.LGeoData;
LGeoData geoData = _ctx.geoData();
String country = geoData.getCountry();
logger.trace("IP location: country - {}, city - {}, factor - {}", country , geoData.getCity());
package com.identityblitz.idp.flow.dynamic;
import java.lang.*;
import java.util.*;
import java.text.*;
import java.time.*;
import java.math.*;
import java.security.*;
import javax.crypto.*;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import com.identityblitz.idp.login.authn.flow.api.*;
import com.identityblitz.idp.login.authn.flow.Context;
import com.identityblitz.idp.login.authn.flow.Strategy;
import com.identityblitz.idp.login.authn.flow.StrategyState;
import com.identityblitz.idp.login.authn.flow.StrategyBeginState;
import com.identityblitz.idp.login.authn.flow.LCookie;
import com.identityblitz.idp.login.authn.flow.LUserAgent;
import com.identityblitz.idp.login.authn.flow.LBrowser;
import com.identityblitz.idp.login.authn.flow.LGeoData;
import com.identityblitz.idp.federation.matching.JsObj;
import com.identityblitz.idp.flow.common.api.*;
import com.identityblitz.idp.flow.dynamic.*;
import java.util.function.Predicate;
import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.lang.invoke.LambdaMetafactory;
import java.util.function.Consumer;
import static com.identityblitz.idp.login.authn.flow.StrategyState.*;
public class EnableSecondFactorByCountry 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) {
Integer reqFactor = (ctx.user() == null) ? null : ctx.user().requiredFactor();
LGeoData geoData = ctx.geoData();
String country = geoData.getCountry();
logger.info("IP location: country - {}, city - {}, factor - {}", country , geoData.getCity());
if(ctx.justCompletedFactor() == 1 && (country == null || !country.equals("Russia")))
return StrategyState.MORE(new String[]{});
else
return StrategyState.ENOUGH();
}
}