Проучвам осъществимостта на използването на персонализиран модул за влизане на 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
трябва да бъде зададена на буквална роля, в моя случай: "потребител"