我有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。
答案 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
并执行该操作。