2012-07-08 56 views
0

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

我不是在寻找一个答案的功课,更是什么,我需要看事物要仔细检查,我可能俯瞰....

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

所以我在文件领域设置了两个用户,一个是User,一个是Admin。我尝试将其设置为基本身份验证,当用户运行该页面时,它不提示登录。我尝试创建一个自定义登录/登录错误页面和表单身份验证,当用户运行该页面时,它不会显示我的登录表单。到目前为止,我所能做的唯一事情就是将Login页面作为欢迎文件,并在表单提交时调用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> 

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> 
+0

到目前为止,你做了什么,看起来不错。但在这里看起来有点不对劲“但是如果我运行它并导航到另一个页面而不输入数据到表单并提交它登录,页面将显示”。你能发布你的web.xml和登录页面的代码吗? – Ravi 2012-07-08 08:27:21

+0

@Ravi所以,在这里粘贴代码并对其进行格式化时,我注意到一些以前没有显示的东西或者我认为已经删除的东西。它被设置为加载index.html作为欢迎文件,我认为我设置了Login.jsp,登录设置为FORM。所以它毕竟显示了登录页面。在删除FORM的标签作为登录类型时,运行它会显示弹出式登录框,出于某种原因,我无法将它显示在前面。尽管如此,它仍然可以让我避开两个网址的限制。也许与我的Glassfish服务器有关? – 2012-07-08 09:27:10

+0

真的开始怀疑我是否有时在错误的web.xml中进行更改。但是Glassfish也很奇怪。它不断清空用户的领域或使团队加倍。 – 2012-07-08 09:31:08

回答

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文档here

+0

控制器是作业的一部分。我们已经多次提到我们得到的任务并不需要它。我放弃了登录配置信息,因为我认为我已经删除它,并将欢迎文件作为Login.jsp,但似乎我在web.xml文件上进行了第一次尝试的更改。 – 2012-07-08 10:08:19

+0

本周我读过文档的次数已经减少了不少。有了FORM,它是否必须使用确切的形式?我已经能够通过我的Login.jsp获取request.login()以在我的控制器中工作。之后,我迷路了。我有控制器将用户名和角色设置为稍后调用的bean,但我相信还有其他方法。这可能更多的是我不是真正了解html而不是其他任何东西。 – 2012-07-08 10:14:38

+0

将Login.jsp更改为Login.xhtml,出于某种原因使用Login.jsp,它不再需要加载,xhtml只显示一个空白页面。 – 2012-07-08 10:36:25