3

问题

在尝试访问安全受限资源或需要登录身份验证时,如何允许未经身份验证的用户通过 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>
4

0 回答 0