Glassfish(Payara)REST错误。邮递员请求失败,带有自定义令牌过滤器的403/401

时间:2018-06-25 11:27:15

标签: java-ee glassfish weld payara

我有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>

问题是,当我在邮递员中执行请求时,我收到了403禁止访问。 我尝试在 glassfish-web.xml 中扮演角色,然后收到401并重定向到页面,但这在我能够成功在控制器中调用该方法之后发生。即使我能够成功调用该方法,我也会得到此401。

1 个答案:

答案 0 :(得分:1)

如果要在web.xml中指定角色,则必须在调用JAX-RS servlet之前对用户进行身份验证。在JAX-RS过滤器中进行身份验证为时已晚。

您可以按照本文所述,使用HttpAuthenticationMechanism向新的Security API进行身份验证:https://www.ibm.com/developerworks/library/j-javaee8-security-api-2/index.html#ibm-h2

问题在于,与对用户进行身份验证的级别相比,您在更高的级别上定义了安全性。在对用户进行身份验证并获得403之前,将在Web.xml中定义的角色比JAX-RS过滤器更早地应用。原因是JAX-RS被实现为servlet,而Payara需要首先运行servlet,运行JAX-RS引擎,该引擎运行您的过滤器。但是web.xml中的配置甚至在执行JAX-RS引擎和过滤器之前就拒绝访问servlet。

另一方面,在应用来自web.xml的安全性检查之前,Payara Server会检测到HttpAuthenticationMechanism并执行该操作。