Я изучаю возможность использования пользовательского модуля входа в систему wildfly.
Клиент передаст идентификатор мобильного устройства на сервер как часть входа в систему. Я проверю правильность имени пользователя и пароля обычным способом, затем мне нужно будет убедиться, что мобильное устройство одобрено для использования службы.
Идея состоит в том, что у меня будет спокойный метод входа в веб-службу, который вызывает HttpServletRequest.login(u, p).
Как получить идентификатор мобильного устройства внутри модуля входа в HttpServletRequest?
Я мог бы войти в систему, и если это удастся, проверьте идентификатор устройства в веб-сервисе, и если это не будет одобрено, выйдите из системы. Но это кажется довольно грязным.
Каков правильный способ сделать это?
ИЗМЕНИТЬ
ОТЗЫВ: Я сделал так, как предложил Крис. Я реализовал свою собственную версию CallBackHandler и реализацию интерфейса обратного вызова, внутри метода входа в мой модуль входа я делаю следующее:
public boolean login() throws LoginException {
boolean login = super.login();
if (login) {
UuidCallback uuidCallback = new UuidCallback();
try {
super.callbackHandler.handle(new Callback[]{uuidCallback});
} catch (Exception e) {
LoginException le = new LoginException("Failed to get uuid");
le.initCause(e);
throw le;
}
System.out.print("Device UUID: "+uuidCallback.getUuid());
}
return login;
}
Внутри метода входа в веб-службу:
@Path("/login")
@Produces({ "application/json" })
public class LoginWebService {
@POST
public Response login(@Context HttpServletRequest request) throws LoginException {
CallbackHandler callbackHandler = new MyCallbackHandler(request.getParameter("username"), request.getParameter("password"), request.getParameter("uuid"));
Subject subject = new Subject();
LoginContext loginContext = new LoginContext("securityDomain", new subject, callbackHandler);
loginContext.login();
MyPrincipal principal = subject.getPrincipals(MyPrincipal.class).iterator().next();
}
}
Вы также можете просто установить uuid в обработчике обратного вызова, а затем вызвать getUUID()
в обработчике обратного вызова внутри метода LoginModule.login
. Но я решил пойти с дизайном, хотя он не совсем имеет смысл для меня.
Я все еще получал 403 при входе в систему и пытался получить доступ к защищенным ресурсам, оказалось, что если auth-constraint/role-name
равно *, вы должны указать хотя бы один security-role
.
<login-config>
<auth-method>FORM</auth-method>
<realm-name>mydomain</realm-name>
</login-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>rest</web-resource-name>
<url-pattern>/rest/app/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>
<!-- after login there is a 403 on protected resources if no role and role-name * -->
<security-role>
<role-name>user</role-name>
</security-role>
У всех моих пользователей есть роль пользователя, которая дает им доступ. Я смог заставить его работать, исключив security-role
, но тогда auth-constraint/role-name
должна быть установлена буквальная роль, в моем случае: «пользователь»