Glassfish (Payara) Ошибка REST. Запрос почтальона не выполняется с 403/401 с пользовательским токен-фильтром - PullRequest
0 голосов
/ 25 июня 2018

У меня Payara версии 182. У меня есть пользовательская проверка токена.

@Priority(Priorities.AUTHENTICATION)
public class TokenAuthenticationFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) {
    // put user into security context so it is available later for role 
     based security and application usage
     requestContext.setSecurityContext(new UserSecurityContext(currentUser, 
    requestContext.getUriInfo().getRequestUri().getScheme()));
    }
}

glassfish-web.xml:

<glassfish-web-app error-url="">
  <security-constraint>
      <web-resource-collection>
          <web-resource-name>Protected Area</web-resource-name>
          <url-pattern>/jsp/security/protected/ *</url-pattern>
          <http-method>PUT</http-method>
          <http-method>DELETE</http-method>
          <http-method>GET</http-method>
          <http-method>POST</http-method>
      </web-resource-collection>
      <auth-constraint>
          <role-name>manager</role-name>
      </auth-constraint>
    <security-role-mapping>      
      <role-name>SystemAdmin</role-name>
      <principal-name>SystemAdmin</principal-name>
      <group-name>SystemAdmin</group-name>
    </security-role-mapping>
    <security-role-mapping>
      <role-name>ADMIN</role-name>
      <principal-name>ADMIN</principal-name>
      <group-name>ADMIN</group-name>
    </security-role-mapping>
    <security-role-mapping>
      <role-name>UserRole</role-name>
      <principal-name>user</principal-name>
      <group-name>appuser</group-name>
    </security-role-mapping>
    <security-role-mapping>
      <role-name>rest-monitoring</role-name>
      <group-name>rest-monitoring</group-name>
    </security-role-mapping>
  </security-constraint>
</glassfish-web-app>

Проблема заключается в том, что я выполняю запрос в Почтальоне Iполучить 403 Запрещено.Я попытался поиграться с ролями в glassfish-web.xml , а затем я получил 401 и был перенаправлен на страницу, но это происходит ПОСЛЕ того, как я успешно смог вызвать метод в контроллере.Я получаю этот 401, хотя я могу успешно вызвать метод.

1 Ответ

0 голосов
/ 25 июня 2018

Если вы хотите указать роли в web.xml, вы должны аутентифицировать пользователя перед вызовом сервлета JAX-RS.Аутентификация в фильтре JAX-RS слишком поздняя.

Вы можете пройти аутентификацию с новым API безопасности, используя HttpAuthenticationMechanism , как описано в этой статье: https://www.ibm.com/developerworks/library/j-javaee8-security-api-2/index.html#ibm-h2

Проблема в том, что вы определяете безопасность на более высоком уровне по сравнению с уровнем, на котором вы аутентифицируете пользователя.Роли, определенные в файле web.xml, применяются раньше, чем фильтр JAX-RS, до того как пользователь пройдет аутентификацию и вы получите 403. Причина в том, что JAX-RS реализован как сервлет, и Payara необходимо сначала запустить сервлет, которыйзапускает движок JAX-RS, который запускает ваш фильтр.Но конфигурация в web.xml запрещает доступ к сервлету даже до того, как обработчик JAX-RS и ваш фильтр будут запущены.

С другой стороны, сервер Payara обнаруживает HttpAuthenticationMechanism и выполняет его до проверки безопасности изweb.xml прилагаются.

...