Использование JavaEE 8 API безопасности со службами JAX-RS - PullRequest
0 голосов
/ 21 октября 2019

Я изучаю 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 выполнен раньше, чем учетные данные хранилища идентификаторовпроверка, но как обойти это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...