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

Posted

技术标签:

【中文标题】如何处理数据库中用户的身份验证/授权?【英文标题】:How to handle authentication/authorization with users in a database? 【发布时间】:2012-04-15 11:31:59 【问题描述】:

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

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

create.xhtml --> 仅适用于登录用户。 events.xhtml --> 对所有人公开。

我计划的基本结构是:

检查页面是否需要登录用户(例如create.xhtml) 如果是,检查用户是否登录 如果用户未登录,请转到login.xhtml 如果登录成功,返回请求页面 保留“用户已登录”信息,除非用户单击注销 按钮。 (我猜@SessionScoped 会发挥作用)

问题是:

    有什么简单的方法可以做到这一点? 我应该在哪里使用@SessionScoped 注释?在Create.javaLoginManager.java? Spring 安全对于我的问题来说看起来有点复杂,真的吗 需要它?如果是,您能否解释一下该实现如何与 JSF 2.0 和 Mongo DB 一起工作?

【问题讨论】:

【参考方案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 之前,它非常简陋;没有“记住我”,错误处理很差,没有基于权限的限制。

另见:

Performing user authentication in Java EE / JSF using j_security_check - 包含完整的代码示例 Java EE kickoff application - 示例 Web 应用程序(由我开发),它还演示了使用 Soteria(JSR-375 RI)进行 Java EE 8 身份验证。

2。自产自销servlet filter

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

优点:

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

缺点:

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

另见:

Is there any easy way to preprocess and redirect GET requests? - 包含身份验证的介绍性解释和启动示例 Authorization redirect on session expiration does not work on submitting a JSF form, page stays the same - 包含更多扩展的启动示例,用于身份验证,也涵盖 ajax 请求 How control access and rights in JSF? - 包含授权启动示例

3。适应第 3 方框架

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

优点:

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

缺点:

一些学习曲线。

另见:

JSF2 - Shiro tutorial - 在 JSF2 webapp 中集成 Shiro 的详尽教程

【讨论】:

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

以上是关于如何处理数据库中用户的身份验证/授权?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Auth UI 如何处理重新身份验证?

您应该如何处理跨微服务的身份验证和共享用户信息?

如何处理 Cognito 上的令牌过期问题

如何处理 grails spring-security-rest 插件中的自定义身份验证异常?

如何处理 SilverLight 4 和 WPF 应用程序的 WCF 身份验证

使用 JWT 令牌时应该如何处理 RESTful 身份验证?