编辑:
在某些情况下,我使用的是自定义安全域,并手动调用request.login.我没有使用标准的FORM身份验证.
编辑:
似乎我真正在寻找的是一种复制< login-config>使用自定义< security-domain>的功能.在jboss中配置,而不是j_security_check.
我需要能够在我的Web应用程序中执行两项不同的任务.首先,我需要确定用户是否已通过身份验证,如果没有通过身份验证,我想将他们重定向到登录页面.我为此使用过滤器.其次,我需要确定用户是否具有正确的角色才能查看我的Web应用程序中的某些页面.似乎web.xml文件中的security-constraint标记将是完成此工作的适当工具,但始终在应用任何过滤器之前首先应用此规则.这意味着,由于用户缺乏适当的角色,因此在被拒绝访问页面之前,永远不会给用户机会登录.
我唯一能想到的解决方案是手动检查筛选器中的用户角色,而不使用安全性约束,但这并不是一个好的解决方案.我想知道这里是否缺少某些内容,因为这似乎是一个非常常见的用例.作为参考,下面粘贴了我的过滤器和示例安全性约束.
编辑:
我使用过滤器检查授权的原因是,您只能为一个特定错误定义一个错误页面(在这种情况下,拒绝403访问).例如,某个角色为“客户”的人试图访问searchCustomer页面.我的安全约束将该页面限制为角色为“ admin”或“ user”的用户,因此生成403错误,并将用户重定向到配置的错误页面error.xhtml.未登录的第二个用户尝试访问main.xhtml.由于未登录,因此他缺少3个允许的角色之一,因此他还收到403错误,并被重定向到error.xhtml.但是,由于他尚未登录,所以我希望将他重定向到登录页面.我看不到使用安全约束和错误页面来区分这两种用例的任何方法.
<security-constraint>
<display-name>SecureApplicationConstraint</display-name>
<web-resource-collection>
<web-resource-name>SecureApplication</web-resource-name>
<description>SecureApplication</description>
<url-pattern>/main.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
<role-name>user</role-name>
<role-name>customer</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<display-name>SearchCustomerPage</display-name>
<web-resource-collection>
<web-resource-name>SecureApplication</web-resource-name>
<description>SecureApplication</description>
<url-pattern>/searchCustomer.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<error-page>
<error-code>403</error-code>
<location>/error.xhtml</location>
</error-page>
过滤:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String uri = req.getRequestURI();
if ((null != req.getUserPrincipal())
|| uri.endsWith("login.xhtml")
|| uri.endsWith("error.xhtml")
|| uri.contains(ResourceHandler.RESOURCE_IDENTIFIER)) {
chain.doFilter(request, response);
} else {
HttpServletResponse res = (HttpServletResponse) response;
res.sendRedirect(req.getContextPath() + "/login.xhtml?from=" + URLEncoder.encode(uri, "UTF-8"));
return;
}
}
解决方法:
您可以使用Java EE 6中的JASPI / JASPIC API进行此操作.
出于某种原因,或者其他JBoss要求您首先激活此API,但是他们有一个有关如何执行此操作的Wiki页面.