Веб-приложение Java: Используя пользовательскую область

Вы можете использовать .filter , чтобы получить объекты в требуемом диапазоне, а затем использовать .map для создания объектов из отфильтрованного списка.

См. Пример ниже:

const arr = [{
    "score": "1200.65",
    "num_games": "160",
    "wins": "110",
    "year": "2013"
},
{
    "score": "705.23",
    "num_games": "34",
    "wins": "21",
    "year": "2014"
},
{
    "score": "467.12",
    "num_games": "77",
    "wins": "30",
    "year": "2015"
}];

const get_items = (arr, [sY, eY], prop) => 
   arr
    .filter(({year}) => +sY <= year && year <= +eY)
    .map(({year:x, ...rest}) => ({x, y: rest[prop]}));


console.log(get_items(arr, ["2014", "2015"], "score"));

13
задан Theyouthis 8 May 2015 в 19:52
поделиться

4 ответа

Примечание: Ответ ниже только действителен для Java EE 5. Как был обращен мое внимание в одном из других ответов, Java EE 6 действительно поддерживает это. Таким образом, при использовании Java EE 6 не читайте этот ответ, но читайте другой соответствующий ответ.

От моего собственного исследования и от ответов до этого вопроса ответ, который я нашел, следующий: Хотя JAAS является стандартным интерфейсом, нет никакого универсального способа записать, развернуть и интегрировать Область JAAS + LoginModule в различных серверах приложений.

Glassfish v2 требует, чтобы Вы расширили некоторые его собственные внутренние классы, которые реализуют LoginModule или Область сами. Вы не можете однако настроить целый процесс входа в систему, потому что много методов интерфейса LoginModule отмечены финал в суперклассе Glassfish. Пользовательские классы LoginModule и Области должны быть помещены в путь к классу AS (не приложение), и область должна быть вручную зарегистрирована (никакое развертывание от .war возможного).

Ситуация, кажется, немного лучше для Tomcat, который позволит Вам кодировать свою собственную Область и LoginModule полностью, и затем настроить их в сервер приложений с помощью его собственного JAASRealm (который делегирует фактическую работу к реализациям Области и LoginModule). Однако даже кот не позволяет развертывать Вашу пользовательскую область от Вашего .war.

Обратите внимание, что ни один из Серверов приложений, которые разоблачили мои результаты, кажется, не может в полной мере воспользоваться всеми Обратными вызовами JAAS. Все они, кажется, только поддерживают основную username+password схему. Если Вам будет нужно что-либо более сложное, чем это, то необходимо будет найти решение, которым не управляет Java контейнер EE.

Для ссылки, и потому что относительно этого попросили в комментариях к моему вопросу, вот код, который я написал для GlassfishV2.

В первую очередь, вот реализация Области:

public class WebserviceRealm extends AppservRealm {

private static final Logger log = Logger.getLogger(WebserviceRealm.class.getName());

private String jaasCtxName;
private String hostName;
private int port;
private String uri;

@Override
protected void init(Properties props) throws BadRealmException, NoSuchRealmException {
    _logger.info("My Webservice Realm : init()");

    // read the configuration properties from the user-supplied properties,
    // use reasonable default values if not present
    this.jaasCtxName = props.getProperty("jaas-context", "myWebserviceRealm");
    this.hostName = props.getProperty("hostName", "localhost");
    this.uri = props.getProperty("uri", "/myws/EPS");

    this.port = 8181;
    String configPort = props.getProperty("port");
    if(configPort != null){
        try{
            this.port = Integer.parseInt(configPort);
        }catch(NumberFormatException nfe){
            log.warning("Illegal port number: " + configPort + ", using default port (8181) instead");
        }
    }
}

@Override
public String getJAASContext() {
    return jaasCtxName;
}

public Enumeration getGroupNames(String string) throws InvalidOperationException, NoSuchUserException {
    List groupNames = new LinkedList();
    return (Enumeration) groupNames;
}

public String getAuthType() {
    return "My Webservice Realm";
}

public String getHostName() {
    return hostName;
}

public int getPort() {
    return port;
}

public String getUri() {
    return uri;
}
}

И затем реализация LoginModule:

public class WebserviceLoginModule extends AppservPasswordLoginModule {

// all variables starting with _ are supplied by the superclass, and must be filled
// in appropriately

@Override
protected void authenticateUser() throws LoginException {
    if (_username == null || _password == null) {
        throw new LoginException("username and password cannot be null");
    }

    String[] groups = this.getWebserviceClient().login(_username, _password);

    // must be called as last operation of the login method
    this.commitUserAuthentication(groups);
}

@Override
public boolean commit() throws LoginException {
    if (!_succeeded) {
        return false;
    }

    // fetch some more information through the webservice...

    return super.commit();
}

private WebserviceClient getWebserviceClient(){
    return theWebserviceClient;
}
}

наконец, в Области должен быть связан с LoginModule. Это сделано на уровне конфигурационного файла JAAS, который в glassfish v2 находится в yourDomain/config/login.conf. Добавьте следующие строки в конце того файла:

myWebserviceRealm { // use whatever String is returned from you realm's getJAASContext() method
    my.auth.login.WebserviceLoginModule required;
};

Это - то, что получило вещи, работающие на меня на glassfish. Снова, это решение не является портативным через серверы приложений, но насколько я могу сказать, нет никакого существующего портативного решения.

10
ответ дан 1 December 2019 в 23:32
поделиться

Наличие имеет беглый взгляд на документацию Солнц, похоже, что необходимо будет записать пользовательский LoginModule, который расширяет их сервер приложений определенный класс. Это кажется немногим назад мне и ограничению Glassfish.

Если бы Вы хотите сделать это более портативное, я предложил бы поместить объем реализации в пользовательском LoginModule, разработанном против стандартного интерфейса (интерфейсов) JavaEE и затем иметь тонкий слой реализации, характерный для Glassfish, который делегирует к стандартной, портативной реализации.

1
ответ дан 1 December 2019 в 23:32
поделиться

Вы никогда не можете развертывать область от ВОЙНЫ, потому что область НЕ является Артефактом Приложения, это - Контейнерный Артефакт (таким образом фраза "основанная на контейнере безопасность"). Можно настроить приложение для использования определенной области в соответствии с контейнером, но приложение не может обеспечить это само.

Тем не менее, в то время как все контейнеры отличаются, и эти области НЕ являются портативными, простой здравый смысл уменьшит различия до немного кода связующего звена, необходимого для интеграции с контейнером при поиске мобильности.

2
ответ дан 1 December 2019 в 23:32
поделиться

Проверьте статью Sun об этом предмете.

Я никогда на самом деле сделал это сам, но я довольно уверен, что каждый AS дает Вам опцию зарегистрировать новые области (домены защиты) на нем.

Это, вероятно, не будет 100%-е портативное устройство, и для каждого AS Вам, возможно, понадобилась бы различная конфигурация XML, но в основном, нет никакой причины кода, чтобы несколько отличаться.

-2
ответ дан 1 December 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: