Я изучаю Java EE 8 Security API для использования в моем приложении, и с помощью учебника на baeldung.com/java-ee-8-security я создал небольшое тестовое приложение с проверкой подлинности формы, простым хранилищем идентификаторов и сервлетом, которое работаетштраф после развертывания на Glassfish 5
AppConfig.java
.....
@FormAuthenticationMechanismDefinition(
loginToContinue = @LoginToContinue(
loginPage = "/login.html",
errorPage = "/login-error.html",
useForwardToLogin = false
)
)
@ApplicationScoped
public class AppConfig {}
TestIdentityStore.java
.....
@RequestScoped
public class TestIdentityStore implements IdentityStore {
public CredentialValidationResult validate(UsernamePasswordCredential usernamePasswordCredential) {
if(usernamePasswordCredential.compareTo("admin", "12345")) {
HashSet<String> roleSet = new HashSet<>();
roleSet.add("admins");
return new CredentialValidationResult(usernamePasswordCredential.getCaller(), roleSet);
}
return INVALID_RESULT;
}
}
AdminServlet.java
@WebServlet("/admin")
@ServletSecurity(value = @HttpConstraint(rolesAllowed = {"admins"}))
public class AdminServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("User: admin");
}
}
Но после замены сервлета службой jax-rs
AppConfig.java
@FormAuthenticationMechanismDefinition(
loginToContinue = @LoginToContinue(
loginPage = "/login.html",
errorPage = "/login-error.html",
useForwardToLogin = false
)
)
@ApplicationPath("/")
public class AppConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> set = new HashSet<>();
set.add(AdminServlet.class);
set.add(RolesAllowedDynamicFeature.class);
return set;
}
}
и AdminServlet.java
@Path("admin")
@RolesAllowed({"admins"})
public class AdminServlet {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String adminPage() {
return "User: admin";
}
}
формы аутентификации не запрашиваются, и приложение немедленно выдает 403 Запрещено.
Я предполагаю, что класс RolesAllowedRequestFilter в классе RolesAllowedDynamicFeature выполнен раньше, чем учетные данные хранилища идентификаторовпроверка, но как обойти это?