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

whi*_*kid 28 database authentication jsf authorization java-ee

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

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

  • create.xhtml - >仅适用于已登录的用户.
  • events.xhtml - >为大家公开.

我计划的基本结构是:

  • 检查页面是否需要登录用户(例如create.xhtml)
  • 如果是,请检查用户是否已登录
  • 如果用户未登录,请转到 login.xhtml
  • 如果成功登录,请返回请求的页面
  • 除非用户单击"注销"按钮,否则请保留"用户已登录"信息.(我想@SessionScoped进入比赛)

问题是:

  1. 这种不那么复杂的方法是什么?
  2. 我应该在哪里使用@SessionScoped注释?在Create.javaLoginManager.java
  3. 对于我的问题,Spring安全性看起来很复杂,我真的需要它吗?如果是的话,你能解释一下实现如何与JSF 2.0和Mongo DB一起工作吗?

Bal*_*usC 60

有几种选择.选择哪一项完全取决于您.只是客观地权衡具体的优缺点,以符合自己的情况.


1.使用Java EE提供的容器管理身份验证

刚刚宣布<security-constraint>web.xml是指它在servletcontainer配置了安全领域.你可以为你的web应用指定应登录和/或角色(一个或多个),例如检查URL模式(S) ,/secured/*,/app/*,/private/*等.

在Java EE 8之前,您遗憾的是仍然需要以特定于servlet容器的方式配置安全性.它通常在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安全规范应该在JASPIC的帮助下解决这个问题.
  • 在Java EE 8之前,没有细粒度的控件.
  • 在Java EE 8之前,它非常简洁; 没有"记住我",糟糕的错误处理,没有基于权限的限制.

也可以看看:


2. Homegrow一个servlet过滤器

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

好处:

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

缺点:

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

也可以看看:


3.调整第三方框架

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

好处:

  • 精细控制.
  • 完全独立于容器.
  • 没有重新发明轮子; 至少自己的代码.
  • 经过大量用户的彻底开发和测试,因此最有可能100%强大.

缺点:

  • 一些学习曲线.

也可以看看: