【问题标题】:How to handle authentication/authorization with users in a database?如何处理数据库中用户的身份验证/授权?
【发布时间】:2021-07-19 23:10:06
【问题描述】:

目前,我正在使用 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 一起工作?

【问题讨论】:

    标签: database jsf jakarta-ee authentication authorization


    【解决方案1】:

    有多种选择。选择哪个完全取决于您。只是客观地权衡一下具体的优缺点符合自己的情况。


    1。使用提供的 Java EE container managed authentication

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

    不幸的是,在 Java EE 8 之前,您仍然需要以特定于 servletcontainer 的方式配置安全领域。它通常在特定于 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。自产自销servlet filter

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

    优点:

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

    缺点:

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

    另见:


    3。适应第 3 方框架

    例如,Apache ShiroSpring Security 等。这通常提供比标准容器管理身份验证更细粒度的配置选项,您无需为此编写任何代码,除了登录页面和当然是一些(XML)配置。

    优点:

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

    缺点:

    • 一些学习曲线。

    另见:

    【讨论】:

    • 亲爱的@BalusC,我使用 servlet 过滤器将用户限制在某些视图 (URL) 中。我担心性能。我使用primefaces,有时单击按钮或更新元素会多次调用过滤器(我猜是因为内部ajax请求)。有没有办法最小化或更好地处理这么多对过滤器的调用?另一个问题是,当使用页面转发而不是重定向时,过滤器获取的请求 url 总是相同的,这使得限制用户变得更加困难。
    • @CristianArteaga:这实际上是 stackoverflow 的一个新问题。如果你发布它,我相信你会得到答案
    猜你喜欢
    • 2015-05-19
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多