如何处理数据库中用户的身份验证/授权?

时间:2012-04-01 15:38:56

标签: database jsf java-ee authentication authorization

目前,我正在使用JSF 2.0,Tomcat 7和MongoDB开发一个Web项目。我有一个很重要的问题,即如何处理数据库中用户的会话管理和身份验证/授权。

我想要的结构如下:只有登录的用户才能创建事件,每个人都可以看到创建的事件。

  • create.xhtml - >仅适用于已登录的用户。
  • events.xhtml - >为所有人公开。

我计划的基本结构是:

  • 检查网页是否需要登录用户(例如create.xhtml
  • 如果是,请检查用户是否已登录
  • 如果用户未登录,请转至login.xhtml
  • 如果成功登录,请返回请求的页面
  • 除非用户点击退出,否则请保留“用户已登录”信息 按钮。 (我猜@SessionScoped开始发挥作用)

问题是:

  1. 这样做的不那么复杂的方法是什么?
  2. 我应该在哪里使用@SessionScoped注释?在Create.javaLoginManager.java
  3. 对于我的问题,Spring安全性看起来很复杂,我真的 需要它?如果是的话,你能解释一下实现如何与JSF 2.0和Mongo DB一起工作吗?

1 个答案:

答案 0 :(得分:57)

有几种选择。选择哪一项完全取决于您。客观地权衡具体的优缺点,以符合自己的情况。


1。使用提供container managed authentication

的Java EE

只需在<security-constraint>中声明一个web.xml,它引用一个在servletcontainer中配置的安全领域。您可以为您的webapp指定应检查登录和/或角色的URL模式,例如: /secured/*/app/*/private/*

在Java EE 8之前,您遗憾的是仍然需要以特定于servlet容器的方式配置安全性。它通常在servletconainer特定的文档中描述。在Tomcat 8的情况下,那是Realm HOW-TO。例如,基于用户/角色表的基于数据库的域在“JDBCRealm”部分中描述。

从Java EE 8开始,最终会有一个基于JSR-375的标准API。

优点:

  • 相对快速且易于设置和使用。
  • 从Java EE 8开始,终于有了一个强大而灵活的标准API。

缺点:

  • 在Java EE 8之前,域配置是特定于容器的。在Java EE 8中,新的JSR-375 Security Spec应该在JASPIC的帮助下解决这个问题。
  • 在Java EE 8之前,没有细粒度控制。
  • 在Java EE 8之前,它非常简洁;没有“记住我”,糟糕的错误处理,没有基于权限的限制。

另见:


2。 Homegrow a servlet filter

这允许更细粒度的控制,但是您需要自己编写所有代码,并且您应该真正了解/了解如何实现这样的过滤器以避免潜在的安全漏洞。在JSF方面,您可以通过sessionMap.put("user", user)将登录用户作为会话属性,并在session.getAttribute("user")不是null的情况下检查过滤器。

优点:

  • 细粒度控制。
  • 完全独立于容器。

缺点:

  • 重新发明轮子;新功能需要大量代码。
  • 作为初学者,您无法确定您的代码是否100%健壮。

另见:


3。适应第三方框架

例如,Apache ShiroSpring Security等。这通常提供比标准容器管理身份验证更精细的配置选项,您不需要自己编写任何代码,期望登录页面和一些(XML)配置当然。

优点:

  • 细粒度控制。
  • 完全独立于容器。
  • 没有重新发明轮子;至少自己的代码。
  • 很多用户彻底开发和测试,因此很可能100%健壮。

缺点:

  • 一些学习曲线。

另见: