Сервер Undertow, HttpHandler, чтобы избежать проверки безопасности - PullRequest
0 голосов
/ 07 апреля 2020

Я хочу защитить какой-либо ресурс с помощью WAR (я использую Wildfly 16 и Keycloak 9.0.2).

В сети. xml Я добавляю ограничение безопасности:

<security-constraint>
    <display-name>Web service</display-name>
    <web-resource-collection>
        <web-resource-name>webserviceapi</web-resource-name>
        <url-pattern>/api/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

Если я вызываю веб-службу, например / api / country / delete / 1, система запрашивает логин. Хорошо, это правильно.

Теперь мне нужно назвать какой-то веб-сервис анонимным, например / api / country / list (но не /api/country/delete/1).

I я пробовал через undertow:

public class CustomHandlerExtension implements io.undertow.servlet.ServletExtension {

@Override
public void handleDeployment(final DeploymentInfo depInfo, final ServletContext servletContext) {

    depInfo.addInitialHandlerChainWrapper(new HandlerWrapper() {

        @Override
        public HttpHandler wrap(HttpHandler httphandler) {

            final ResourceHandler freeResourceHandler = new ResourceHandler().setResourceManager(depInfo.getResourceManager());    

            io.undertow.predicate.Predicate predicato = Predicates.suffixes(".css",".js");

            PathHandler pathHandler = Handlers.path(httphandler);
            pathHandler.addPrefixPath("/api/country", new SecurityHandler(httphandler));

            PredicateHandler myHandler = new PredicateHandler(predicato, freeResourceHandler,  pathHandler);

            return myHandler;
        }

    });

}   
}

В коде, если я запрашиваю *.css или *.js, даже если я помещаю его в ограничение безопасности, проверка безопасности не выполняется, поэтому процесс выполняется быстрее.

Но теперь мне нужно добавить обработчик для освобождения веб-службы, поэтому мне нужно только пропустить проверку безопасности и go непосредственно в EJB, который предоставляет службу (например, CountryEJB).

Возможно ли это? Как мне достичь этого результата?

Необходимость: Я хочу какой-нибудь веб-сервис для незарегистрированных пользователей. Они необходимы для создания html форм и всплывающих окон (например, для выбора страны). Я не могу использовать web. xml в WAR, потому что он используется несколькими EAR и у них нет одинаковых политик.

Я не хочу просить keycloak для не заблокированные ресурсы.

...