У меня есть 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>
Проблема в том, что когда я выполняю запрос в Postman, я получаю 403 Forbidden. Я попытался поиграть с ролями в glassfish-web.xml, а затем я получил 401 и меня перенаправили на страницу, но это происходит ПОСЛЕ того, как я успешно могу вызвать метод в контроллере. Я получаю это 401, хотя могу успешно вызвать метод.
Если вы хотите указать роли в 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 и ваш фильтр.
С другой стороны, HttpAuthenticationMechanism
обнаруживается сервером Payara и запускается до того, как будут применены проверки безопасности из web.xml.