如何处理数据库中用户的authentication/授权?

目前,我正在使用JSF 2.0,Tomcat 7和MongoDB开发Web项目。 我有一个很大的问题,就是如何处理数据库中的用户的会话pipe理和authentication/授权。

我想要的结构如下:只有login的用户可以创build事件,每个人都可以看到创build的事件。

  • create.xhtml – >仅适用于login用户。
  • events.xhtml – >公开为每个人。

我正在计划的基本结构是:

  • 检查页面是否需要login用户(例如create.xhtml
  • 如果是,请检查用户是否login
  • 如果用户未login,请转到login.xhtml
  • 如果成功login,请回到请求的页面
  • 保持“用户已login”信息,除非用户单击注销button。 (在那里我猜@SessionScoped进场)

问题是:

  1. 这样做的较简单的方法是什么?
  2. 我应该在哪里使用@SessionScoped注释? 在Create.javaLoginManager.java
  3. 春季安全看起来有点复杂,我真的需要吗? 如果是的话,你能解释一下实现如何与JSF 2.0和Mongo DB一起工作吗?

有几个选项。 哪个select完全取决于你。 只是客观地衡量具体的利弊符合你自己的情况。


1.使用Java EE提供的容器pipe理authentication

只需在web.xml声明一个<security-constraint> ,它指向在servletcontainer中configuration的安全领域。 您可以为您的webapp指定应该检查login和/或angular色的URL模式,例如/secured/*/app/*/private/*等。

在Java EE 8之前,您不幸的是仍然需要以特定于servletcontainer的方式configuration安全实体。 通常在servletconainer特定的文档中描述。 在Tomcat 8的情况下,这就是Realm HOW-TO 。 例如,基于用户/angular色表的数据库领域将在“JDBCRealm”部分进行介绍。

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

优点:

  • 相对快速和易于安装和使用。
  • 自Java EE 8以来,终于有了一个强大而灵活的标准API。

缺点:

  • 在Java EE 8之前,领域configuration是特定于容器的。 在Java EE 8中,新的JSR-375安全规范应该在JASPIC的帮助下解决。
  • 在Java EE 8之前,没有细粒度的控制。
  • 在Java EE 8之前,这是非常简陋的; 没有“记住我”,糟糕的error handling,没有基于许可的限制。

也可以看看:

  • 使用j_security_check在Java EE / JSF中执行用户authentication – 包含完整的代码示例
  • Java EE启动应用程序 – 示例Web应用程序(由我开发),它也演示了Soteria (JSR-375 RI)的Java EE 8authentication。

2.长大一个servletfilter

这允许更好的粒度控制,但是你将需要自己编写所有的代码,你应该知道/理解你应该如何实现这样一个filter,以避免潜在的安全漏洞。 在JSF方面,例如,可以通过sessionMap.put("user", user)将login用户作为会话属性,并在session.getAttribute("user")不为null检查filter。

优点:

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

缺点:

  • 重新发明车轮; 新function需要大量的代码。
  • 作为首发,你永远不知道你的代码是否100%健壮。

也可以看看:

  • 有没有简单的方法来预处理和redirectGET请求? – 包含介绍性说明和启动示例进行身份validation
  • 会话过期授权redirect在提交JSF表单时不起作用,页面保持不变 – 包含更多的扩展启动示例用于身份validation,其中也涵盖了Ajax请求
  • JSF:如何控制JSF中的访问和权限? – 包含授权的启动示例

3.适应第三方框架

例如, Apache Shiro , Spring Security等等。这通常比标准的容器pipe理authentication提供更好的粒度configuration选项,你不需要自己编写任何代码,期望login页面和一些(XML)configuration当然。

优点:

  • 细粒度的控制。
  • 完全容器独立。
  • 没有重新发明轮子; 自己的代码最less。
  • 由很多用户彻底开发和testing,所以最有可能100%健壮。

缺点:

  • 一些学习曲线。

也可以看看:

  • JSF2 – Shiro教程 – 关于在JSF2 webapp中集成Shiro的广泛教程