问题
在尝试访问安全受限资源或需要登录身份验证时,如何允许未经身份验证的用户通过 https 获得 login.xhtml JSF2.0 Facelet 页面。
当前实施
我正在使用 NetBeans 7.3 进行开发。服务器是 GlassFigh 3.1.2.2。使用 PrimeFaces 3.5 组件。安全性是在 JDBCRealm 下管理的容器。我遵循了 BalusC 在使用 j_security_check 在 Java EE / JSF 中执行用户身份验证中的回答非常有帮助地描述的模式。
基本上:
- 使用部署描述符的声明式安全
- 基于表单的身份验证(使用 @ViewScoped @ManagedBean 的完整 JSF 组件 Facelet login.xhtml 使用 Servlet 3.0 HttpServletRequest.login() 进行编程登录)
- JDBC领域
当我从 localhost 机器或 LAN 上的任何机器运行程序时,一切都运行良好并且符合要求。index.xhtml 是我的 web.xml 下的欢迎文件,它也受到安全约束的保护。因此我的
<form-login-page>/login.xhtml</form-login-page>
当从浏览器命中上下文根时显示。为了在用户数据约束下要求机密,login.xhtml 也处于安全约束之下。这成功地将 https 应用于登录表单,这就是我在上面回答我自己的问题的方式。
问题
每当我尝试使用标准 Safari 浏览器从我的 LAN 外部(来自互联网)加载页面时,我看到服务器将我的 url 从 http 8080 端口切换到 https 8181 端口后,服务器停止响应错误。我也得到一个
INFO: JACC Policy Provider:Failed Permission Check: context (" WebApplication2/WebApplication2 ") , 权限 (" ("javax.security.jacc.WebUserDataPermission" "/login.xhtml" "GET") ")
netbeans glassfigh 输出窗口中的消息。为什么这与 LAN 上的工作方式不同?
想法
当前的 web.xml 没有为“安全登录”安全约束指定 auth-constraint 元素,因为 Java EE 6 教程说“如果没有授权约束,容器必须接受请求而不需要用户身份验证”。如果我使用 * 角色名称指定身份验证约束,则应用程序的行为仍然相同(同样的问题)。显然,如果我给它一个应用程序角色名称,那么用户一开始就永远不会被解析为一个角色。这种实现模式一开始就完全错误吗?
代码
我的 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>#{loggedInUser.preferences.theme}</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>10</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
<security-constraint>
<display-name>index</display-name>
<web-resource-collection>
<web-resource-name>index</web-resource-name>
<description/>
<url-pattern>/index.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<display-name>secure login</display-name>
<web-resource-collection>
<web-resource-name>login.xhtml</web-resource-name>
<description/>
<url-pattern>/login.xhtml</url-pattern>
</web-resource-collection>
<user-data-constraint>
<description/>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>jdbc-realm</realm-name>
<form-login-config>
<form-login-page>/login.xhtml</form-login-page>
<form-error-page>/loginError.xhtml</form-error-page>
</form-login-config>
</login-config>
<security-role>
<description/>
<role-name>admin</role-name>
</security-role>
</web-app>