jsf2 / glassfish3安全

时间:2012-07-08 04:21:18

标签: jsf-2 security glassfish-3

真的很大的问题。再次完成家庭作业。我几乎放弃了试图让它发挥作用,没有足够的时间了。我已经尝试阅读docs.oracle上的所有关于安全性的内容,关于NetBeans安全性的所有内容,以及类中提供的所有内容(教科书不包括任何内容,因此不能将其归咎于过时的本书)和一堆教程通过谷歌和很多问题在这里。我无法让它发挥作用。

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

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

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

我可能缺少一些简单的东西,并且进入这个课程不知道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>

login.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>

1 个答案:

答案 0 :(得分: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中,您需要指定将表单POST到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文档here