目前,我正在使用JSF 2.0,Tomcat 7和MongoDB开发一个Web项目 . 我有一个很大的问题,如何处理数据库中用户的会话管理和身份验证/授权 .
我想要的结构如下:只有登录用户才能创建事件,每个人都可以看到创建的事件 .
-
create.xhtml
- >仅适用于已登录的用户 . -
events.xhtml
- >公开给大家 .
我计划的基本结构是:
-
检查页面是否需要登录用户(例如
create.xhtml
) -
如果是,请检查用户是否已登录
-
如果用户未登录,请转至
login.xhtml
-
如果成功登录,请返回请求的页面
-
保留"User is logged in"信息,除非用户单击“注销”按钮 . (我想
@SessionScoped
开始玩)
问题是:
-
这样做的不那么复杂的方法是什么?
-
我应该在哪里使用
@SessionScoped
注释?在Create.java
或LoginManager.java
? -
对于我的问题,Spring安全性看起来很复杂,我真的需要它吗?如果是的话,你能解释一下实现如何与JSF 2.0和Mongo DB一起工作吗?
1 回答
有几种选择 . 选择哪一项完全取决于您 . 只是客观地权衡具体的优缺点,以符合自己的情况 .
1.使用Java EE提供的容器管理身份验证
只需在
web.xml
中声明<security-constraint>
,它引用在servletcontainer中配置的安全域 . 您可以为您的webapp指定应检查登录和/或角色的URL模式,例如:/secured/*
,/app/*
,/private/*
等在Java EE 8之前,您遗憾的是仍然需要以特定于servlet容器的方式配置安全性 . 它's usually described in servletconainer-specific documentation. In case of Tomcat 8, that'是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之前,它非常简洁;没有"remember me",错误处理不好,没有基于权限的限制 .
另见:
Performing user authentication in Java EE / JSF using j_security_check - 包含完整的代码示例
Java EE kickoff application - 示例Web应用程序(由我开发),它还演示了使用Soteria(JSR-375 RI)的Java EE 8身份验证 .
2. Homegrow一个servlet过滤器
这样可以实现更精细的控制,但是您需要自己编写所有代码,并且您应该真正了解/了解应该如何实现这样的过滤器以避免潜在的安全漏洞 . 在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请求
JSF: How control access and rights in JSF? - 包含授权的启动示例
3.改编第三方框架
例如,Apache Shiro,Spring Security等 . 这通常提供比标准容器管理身份验证更精细的配置选项,并且您不需要自己编写任何代码,期望登录页面和一些(XML)配置当然 .
优点:
细粒度控制 .
完全独立于容器 .
没有重新发明轮子;至少自己的代码 .
由很多用户彻底开发和测试,因此很可能100%强大 .
缺点:
另见: