如何处理数据库中用户的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
进场)
问题是:
- 这样做的较简单的方法是什么?
- 我应该在哪里使用
@SessionScoped
注释? 在Create.java
或LoginManager.java
? - 春季安全看起来有点复杂,我真的需要吗? 如果是的话,你能解释一下实现如何与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的广泛教程