Как я могу отключить аутентификацию для определенного сервлета / pathSpec? - PullRequest
0 голосов
/ 21 сентября 2018

Мой код выглядит следующим образом (ссылка Embedded Jetty - программно добавить аутентификацию на основе формы ):

    ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS | ServletContextHandler.SECURITY);

    context.addServlet(new ServletHolder(new DefaultServlet() {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.getWriter().append("Hello " + request.getUserPrincipal().getName());
        }
    }), "/*");

    context.addServlet(new ServletHolder(new DefaultServlet() {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.getWriter().append("<html><form method='POST' action='/j_security_check'>"
                    + "<input type='text' name='j_username'/>"
                    + "<input type='password' name='j_password'/>"
                    + "<input type='submit' value='Login'/></form></html>");
        }
    }), "/login");

    context.addServlet(new ServletHolder(new DefaultServlet(){
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.getWriter().append("This is the metrics page!");
        }
    }), "/metrics");

    Constraint constraint = new Constraint();
    constraint.setName(Constraint.__FORM_AUTH);
    constraint.setRoles(new String[]{"admin"});
    constraint.setAuthenticate(true);

    ConstraintMapping constraintMapping = new ConstraintMapping();
    constraintMapping.setConstraint(constraint);
    constraintMapping.setPathSpec("/*");

    ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler();
    securityHandler.addConstraintMapping(constraintMapping);
    TestingLoginService loginService = new TestingLoginService();
    securityHandler.setLoginService(loginService);

    FormAuthenticator authenticator = new FormAuthenticator("/login", "/login", false);
    securityHandler.setAuthenticator(authenticator);

    context.setSecurityHandler(securityHandler);

Это работает, но я хочу, чтобы сервлет / metrics не требовал от пользователябыть аутентифицированным.Однако я все еще хочу, чтобы все другие пути шли к логину и сервлету "Hello".

Единственное другое решение, которое я могу придумать, - это переместить сервлет "Hello" на другой путь и получить корневой путь.просто перенаправить на этот путь.Таким образом, я могу установить pathSpec для ConstraintMapping так, чтобы он не охватывал также путь / metrics.

1 Ответ

0 голосов
/ 21 сентября 2018
ConstraintMapping constraintMapping = new ConstraintMapping();
constraintMapping.setConstraint(constraint);
constraintMapping.setPathSpec("/*");

К сожалению, в сопоставлениях серверных ограничений нет понятия «исключить».

Вам придется добавить несколько спецификаций пути, которые охватывают то, что вы хотите, и просто не включать путь /metricsспецификация в этом списке спецификаций пути.

...