Передача информации между Java LoginModules (общая проблема карты) - PullRequest
2 голосов
/ 30 июня 2011

В настоящее время я пытаюсь написать несколько модулей LoginModules, чтобы пользователи могли войти в приложение Java.Вот мой файл .java.login.config:

"Java Application" {
    path.to.login.module.PamLoginModule   sufficient;
    path.to.login.module.OtherLoginModule sufficient;
};

Так что, если PamLoginModule не работает, я хочу передать информацию в OtherLoginModule.Таким образом, OtherLoginModule не нужно будет снова запрашивать имя пользователя и пароль.Поэтому я предполагаю, что для этого и используется карта sharedState в функции initialize ():

initialize(Subject subject, CallbackHandler callbackHandler, 
           Map<String,?> sharedState, Map<String,?> options) 

Проблема в том, что вы не можете поместить вещи в карту sharedState.Если я делаю что-то вроде:

sharedState.put("key", value); // Value is a string

Компилятор жалуется:

path/to/login/module/PamLoginModule.java:48: put(java.lang.String,capture#833 of ?) in java.util.Map<java.lang.String,capture#833 of ?> cannot be applied to (java.lang.String,java.lang.String)
    this.sharedState.put("key", value);

Я нашел способ обойти это, но я хочу знать, каков правильный путь.

Во-первых, я могу использовать версию инициализации java 1.4.2, которая выглядит следующим образом:

initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) 

Таким образом, я просто получаю общие карты и могу просто привести объект Map к карте

Map<String,Object> this.sharedState = (Map<String,Object>)sharedState;

Проблема в том, что я все еще получаю непроверенные исключения приведения.Теперь я знаю, что люди, которые создали интерфейс LoginModule, не глупы, поэтому мне интересно, почему они сделали карту sharedState Map<String,?> вместо Map<String,Object>.Кроме того, есть ли лучший способ поместить вещи в карту sharedState?

Спасибо!

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Если вы посмотрите на реализации LoginModule в Java SDK, они сохранят эти карты в локальные поля без информации generics , то есть простых Карт.И в коде они помещают объекты туда (по крайней мере, когда пользователь аутентифицирован).Поэтому использование знака вопроса в интерфейсе LoginModule должно быть ошибкой проектирования.

1 голос
/ 30 июня 2011

Мне интересно, почему они сделали карту sharedState Map<String,?>, а не Map<String,Object>.

Это именно то, что мне интересно.Я предполагаю, что цель использования ? состоит в том, чтобы принять что-либо (я не вижу другого объяснения), поэтому использование Object было бы совершенно правильным и стандартным.спросите, кто его так закодировал (используя ?), чтобы узнать почему.Поэтому вам следует немного изучить соответствующие классы / методы, чтобы выяснить, действительно ли есть конкретное и конкретное применение для ?.В противном случае вы должны сделать это <String, Object>.

Я лично никогда не видел это текущее использование, за исключением случаев, когда ? указано как <? implements MyInterface> или <T extends MySuperClass>, например.В первом случае вы все равно сможете сделать Map<String, MyInterface> с тем же результатом.

Извините, если у меня нет конкретного ответа, но я надеюсь, что это поможет вам!

...