0

真是大问题。又是家庭作业。我已经几乎放弃了尝试让它工作,没有足够的时间了。我尝试通读 docs.oracle 上有关安全性的所有内容,NetBeans 上有关安全性的所有内容,课程提供的所有内容(教科书没有涵盖任何内容,因此这次不能将其归咎于一本过时的书)和一个一堆通过谷歌的教程和很多问题在这里。我无法让它工作。

我不是在寻找家庭作业的答案,更多的是我需要看的东西和需要仔细检查的东西,我可能会忽略......

该应用程序应允许两个不同组中的用户登录。管理员用户可以访问所有内容,而用户用户只能访问 /user/*。我们不限于严格的程序安全性,也不限于特定的声明性安全性。我们必须创建一个 servlet 来控制页面流(正如我向讲师提到的那样,JSF 带有一个控制器,并且可以通过框架控制页面流已经不影响他的决定。)如果有人当前没有登录在尝试访问受保护区域之一时,应根据我们的安全实施提示他们登录/重定向到登录页面/登录需要发生的任何事情。如果登录的用户用户尝试访问管理区域,他们应该提示他们不是管理员,没有关于是否应该将它们返回到原来的位置、注销或提示以管理员身份登录的详细信息。唯一的要求是我们不能使用数据库来存储用户名和密码。

所以我在文件领域设置了两个用户,一个是用户,一个是管理员。我尝试将其设置为基本身份验证,当用户运行页面时它不会提示登录。我尝试创建自定义登录/登录错误页面和表单身份验证,当用户运行页面时它不会显示我的登录表单。到目前为止,我唯一能做的就是将登录页面作为欢迎文件并在表单提交时调用 servlet,它使用 request.login(username, password) 并在找到用户时登录用户境界与一切相配。然后,我可以检查角色并在用户的 bean 中设置内容,并根据分配的角色将它们转发到正确的起始页面。但是,如果我运行它并导航到另一个页面而不将数据输入表单并将其提交以登录,则页面将显示。如果我以用户角色登录并导航到管理区域页面之一,它让我。我已经为 url 设置了安全约束,我使用了我在这里看到的示例中的过滤器来处理不同的 url,并且它们不会被调用。

我可能缺少一些简单的东西,进入这个类不知道 html 和 java 以外的东西可能是最大的问题,老实说,我不知道我在这个类中是如何成为边界线 A
....这个项目比这更重要,但其余的不是我认为自己有问题的东西,但我已经在这个星期的大部分时间里挂断了这个安全部分,甚至还没有开始。

web.xml

    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</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>
        <servlet-name>Controller</servlet-name>
        <servlet-class>Project2.Controller</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Controller</servlet-name>
        <url-pattern>/Controller</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    <security-constraint>
        <display-name>AdminConstraint</display-name>
        <web-resource-collection>
            <web-resource-name>admin</web-resource-name>
            <description/>
            <url-pattern>/admin/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <description/>
            <role-name>Admin</role-name>
        </auth-constraint>
    </security-constraint>
    <security-constraint>
        <display-name>UserConstraint</display-name>
        <web-resource-collection>
            <web-resource-name>user</web-resource-name>
            <description/>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <description/>
            <role-name>User</role-name>
        </auth-constraint>
    </security-constraint>
    <security-role>
        <description/>
        <role-name>User</role-name>
    </security-role>
    <security-role>
        <description/>
        <role-name>Admin</role-name>
    </security-role>
    </web-app>

登录.xhtml

    <f:view>
        <html>
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
                <title>JSP Page</title>
            </head>
            <body>
                <h1><h:outputText value="Welcome!  Choose an action below."/></h1>

                <form method="Post" action="Controller">
                    <h:inputText id="userName" value=""/>
                    <h:inputSecret id="password" value=""/>
                    <h:commandButton value="Login" type="submit"/>
                </form>
            </body>
        </html>
    </f:view>
4

1 回答 1

0

因此,根据您的目标,您的目标似乎是实现基于容器的身份验证和授权。因此,除了您拥有的内容之外,您还需要将登录配置添加到您的部署描述符中,如下所示:

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>yourRealmName</realm-name>
    <form-login-config>
      <form-login-page>/login.xhtml</form-login-page>
      <form-error-page>/error.xhtml</form-error-page>
    </form-login-config>
</login-config>

上面的配置指定了用户输入用户名和密码的登录页面,以及认证失败时重定向到的错误页面。

在您的 login.xhtml 中,您需要指定将表单发布到 j_security_check,如下所示:

<form action="j_security_check" method="POST">
  <input type="text" name="j_username" />
  <input type="secret" name="j_password" />
  ...
</form>

除了基于容器的身份验证之外,您还可以在提交表单时进行编程身份验证。检查用户角色并返回所需的操作结果。我认为你不再需要那个控制器了。

有关这方面的更多详细信息,请参阅此处的 Java EE 6 文档

于 2012-07-08T09:55:06.827 回答