java-如何在JBoss EAP6 / AS7中的安全约束之前应用过滤器

编辑:
在某些情况下,我使用的是自定义安全域,并手动调用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页面.

上一篇:java-@WebServlet中的拦截器未激活


下一篇:java-通过jboss上的resteasy为jaxb配置输出XML版本的最佳方法