目前,我正在做一个使用JSF2.0、Tomcat7和MongoDB的Web项目.我有一个很大的问题,那就是如何处理数据库中用户的会话管理和身份验证/授权.

我想要的 struct 如下:只有登录的用户可以创建事件,每个人都可以看到创建的事件.

  • create.xhtml --> only for logged in users.
  • events.xhtml --> public for everyone.

我计划的基本 struct 是:

  • 判断页面是否需要登录用户(例如create.xhtml)
  • 如果是,判断用户是否已登录
  • 如果用户未登录,请转到login.xhtml
  • 如果成功登录,请返回请求页面
  • 保留"用户已登录"信息,除非用户单击"注销"

问题是:

  1. 做这件事不那么复杂的方法是什么?
  2. 我应该在哪里使用@SessionScoped注释?在Create.java年或 LoginManager.java
  3. Spring Security对于我的问题看起来有点复杂,我真的要这么做吗? 需要吗?如果是,您能解释一下这个实现是如何与JSF2.0和Mongo DB一起工作的吗?

推荐答案

有几个选项. Select 哪一个完全由你决定.客观地权衡具体的利弊,符合自己的情况.


1. Use Java EE provided container managed authentication

只需在web.xml中声明<security-constraint>,它引用在servlettainer中配置的安全领域.您可以为您的Web应用程序指定应判断登录和/或角色的URL模式,例如/secured/*/app/*/private/*等.

遗憾的是,在JavaEE8之前,您仍然需要以特定于servlettainer的方式配置安全领域.它通常在特定于servletconainer的文档中描述.在Tomcat8的情况下,这是Realm HOW-TO.例如,"JDBCRealm"一节描述了基于用户/角色表的基于数据库的领域.

从JavaEE8开始,最终将有一个基于JSR-375的标准API.

优势:

  • 相对快速且易于设置和使用.
  • 从JavaEE8开始,终于有了健壮而灵活的标准API.

缺点:

  • 在JavaEE8之前,领域配置是特定于容器的.在JavaEE8中,新的JSR-375 Security Spec应该在JASPIC的帮助下解决这个问题.
  • 在JavaEE8之前,没有细粒度控件.
  • 在JavaEE8之前,它非常简单;没有"记住我",差劲的错误处理,没有基于权限的限制.

另请参阅:


2. Homegrow a servlet filter

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

优势:

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

缺点:

  • 轮子的重新发明;新功能需要大量代码.
  • 作为初学者,您永远不能确定您的代码是否100%健壮.

另请参阅:


3. Adapt a 3rd party framework

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

优势:

  • 细粒度控制.
  • 完全独立于容器.
  • 没有轮子的翻新;最低限度的自己的代码.
  • 经过大量用户的全面开发和测试,所以很可能100%健壮.

缺点:

  • 一些学习曲线.

另请参阅:

Database相关问答推荐

Postgres和Oracle之间 Select 查询的结果差异

如何限制报表中返回的行数?

DBMS_RANDOM 是否默认安装?

如何在mongodb数据库中设置导入的CSV文件的字段之间的关系

通过 mySQL 命令行直接上传图片

在 model.save() 中处理竞争条件

执行次数最多的存储过程?

跨不同数据库创建视图

Symfony ArrayCollection 与 PersistentCollection

使用varchar作为主键?

在 PostgreSQL 中使用 pg_notify(text, text) 监听/通知

将数据库表用作作业(job)队列的最佳方式是什么?

按最强 LIKE 排序 SQL?

customer客户表的数据库 struct ,每个客户有很多订单,每个订单有很多商品

为什么在连接表上有一个主键不好?

谁有维基数据库?

获取数据库路径

限制 SQL JOIN

在mysql中 Select 不同的2列组合

Windows phone 7 的本地 Sql 数据库支持