如何处理数据库中用户的身份验证/授权?
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.java
或
LoginManager.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 实际上是 *** 的一个新问题。如果你发布它,我相信你会得到答案以上是关于如何处理数据库中用户的身份验证/授权?的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 grails spring-security-rest 插件中的自定义身份验证异常?