Я новичок в WebSphere 9 и пытаюсь настроить вход в систему для приложения JAAS.
Я установил флажок «включить защиту приложения» и закодировал пользовательский LoginModule.
Я настроил свой модуль в разделе «Безопасность» -> «Глобальная безопасность» -> «Вход в приложение» следующим образом:
- Я выбрал псевдоним «myAlias» (который я буду использовать позже в LoginContext)
- Я указал имя класса моего модуля (включенный прокси-модуль и выбран как обязательный)
- Я настроил некоторые пользовательские свойства
Затем я настроил свой web.xml, чтобы некоторые из веб-страницзащищены, и я определил страницы входа и ошибки.
Моя форма входа в систему отправляет имя пользователя и пароль контроллеру, который выполняет следующий код:
WSCallbackHandlerImpl callbackHandler = new WSCallbackHandlerImpl(username, password);
LoginContext lc = new LoginContext("myAlias", callbackHandler);
lc.login();
Subject s = lc.getSubject();
WSSubject.setRunAsSubject(s);
Пока все хорошо. Когда я пытаюсь получить доступ к защищенной странице, мой браузер перенаправляет на страницу входа. Я отправляю своего пользователя / пароль на мой контроллер, и он выполняет lc.login (), поэтому вызывается мой пользовательский LoginModule, и аутентификация проходит нормально. Но затем контроллер отправляет перенаправление на защищенную страницу, контейнер, похоже, не знает об аутентификации и снова возвращает меня на страницу входа. Кроме того, если я попробую это:
@Resource
private SessionContext sessionContext;
....
Principal principal = sessionContext.getCallerPrincipal();
Мой принципал: UNAUTHENTICATED
Это мой web.xml
<security-constraint>
<display-name>User Pages</display-name>
<web-resource-collection>
<web-resource-name>Protected</web-resource-name>
<url-pattern>/protected/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
<http-method>HEAD</http-method>
<http-method>PUT</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
<http-method>DELETE</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>ADMINISTRATOR</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/public/login.xhtml</form-login-page>
<form-error-page>/public/login.xhtml</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>ADMINISTRATOR</role-name>
</security-role>
И это мой модуль входа в систему:
Subject loginSubject;
CallbackHandler loginCallbackHandler;
private String username;
private List<String> rolenames;
private boolean succeeded = false;
private boolean commitSucceeded = false;
@Override
public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState,
Map<String, ?> options) {
this.loginSubject = subject;
this.loginCallbackHandler = callbackHandler;
}
@Override
public boolean login() throws LoginException {
Callback[] callbacks = new Callback[2];
callbacks[0] = new NameCallback("username");
callbacks[1] = new PasswordCallback("password", false);
try {
loginCallbackHandler.handle(callbacks);
} catch (IOException | UnsupportedCallbackException e) {
throw new LoginException();
}
String name = ((NameCallback) callbacks[0]).getName();
String pass = String.valueOf(((PasswordCallback) callbacks[1]).getPassword());
succeeded = check (name, pass);
if (succeeded) {
username = name;
rolenames = setUpRoles(name);
}
return true;
}
@Override
public boolean commit() throws LoginException {
if (!succeeded)
return false;
try {
MyPrincipal user = new MyPrincipal(username);
loginSubject.getPrincipals().add(user);
for (String rolename : rolenames) {
MyRole role = new MyRole(rolename);
loginSubject.getPrincipals().add(role);
}
username = null;
rolenames = null;
commitSucceeded = true;
return true;
} catch (Exception e) {
throw new LoginException(e.getMessage());
}
}
Я что-то упустил? У меня есть некоторые сомнения:
- Можно / нужно ли использовать request.login () в моем контроллере, как я использовал на других серверах?
- Нужно ли использовать системный логин иизменить / клонировать WEB_INBOUND?
- Нужно ли настраивать какое-либо отображение пользователя / роли?
Заранее спасибо