修改 对于某些上下文,我使用自定义安全域并手动调用request.login。我没有使用标准的FORM身份验证。
修改
看起来我真正想要的是使用jboss中配置的自定义<login-config>
而不是j_security_check复制<security-domain>
功能的方法。
我需要能够在我的网络应用中做两件不同的事情。首先,我需要能够确定用户是否经过身份验证,如果不是,我想将其重定向到登录页面。我正在使用过滤器。其次,我需要确定用户是否具有正确的角色才能查看我的webapp中的某些页面。似乎web.xml文件中的security-constraint标记对于此作业来说是正确的工具,但是在任何过滤器之前始终首先应用此规则。这意味着在拒绝访问页面之前,用户永远不会有机会登录,因为他缺少适当的角色。
我能够想到的唯一解决方案是手动检查过滤器中的用户角色而不是使用安全约束,但这不是一个好的解决方案。我想知道这里是否有我遗漏的东西,因为这似乎是一个非常常见的用例。作为参考,下面粘贴了我的过滤器和示例安全约束。
修改 我使用过滤器检查授权的原因是因为您只能为特定错误定义一个错误页面(在这种情况下,403拒绝访问)。例如,具有“customer”角色的某人尝试访问searchCustomer页面。我的安全约束将该页面限制为具有角色“admin”或“user”的用户,因此生成403错误并将用户重定向到配置的错误页面error.xhtml。未登录的第二个用户尝试访问main.xhtml。因为他没有登录,所以他缺少3个允许的角色中的一个,因此他也收到403错误并被重定向到error.xhtml。但是,由于他没有登录,我宁愿将其重定向到登录页面。我没有看到使用security-constraint和error-page区分这两个用例的方法。
<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;
}
}
答案 0 :(得分:3)
您可以使用Java EE 6中的JASPI / JASPIC API执行此操作。
出于某种原因或其他JBoss要求您首先激活此API,但他们有一个关于如何执行此操作的Wiki页面。