首页 文章

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

提问于
浏览
26

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

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

  • create.xhtml - >仅适用于已登录的用户 .

  • events.xhtml - >公开给大家 .

我计划的基本结构是:

  • 检查页面是否需要登录用户(例如 create.xhtml

  • 如果是,请检查用户是否已登录

  • 如果用户未登录,请转至 login.xhtml

  • 如果成功登录,请返回请求的页面

  • 保留"User is logged in"信息,除非用户单击“注销”按钮 . (我想 @SessionScoped 开始玩)

问题是:

  • 这样做的不那么复杂的方法是什么?

  • 我应该在哪里使用 @SessionScoped 注释?在 Create.javaLoginManager.java

  • 对于我的问题,Spring安全性看起来很复杂,我真的需要它吗?如果是的话,你能解释一下实现如何与JSF 2.0和Mongo DB一起工作吗?

1 回答

  • 56

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


    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",错误处理不好,没有基于权限的限制 .

    另见:


    2. Homegrow一个servlet过滤器

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

    优点:

    • 细粒度控制 .

    • 完全独立于容器 .

    缺点:

    • 重新发明轮子;新功能需要大量代码 .

    • 作为初学者,您永远不确定您的代码是否100%健壮 .

    另见:


    3.改编第三方框架

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

    优点:

    • 细粒度控制 .

    • 完全独立于容器 .

    • 没有重新发明轮子;至少自己的代码 .

    • 由很多用户彻底开发和测试,因此很可能100%强大 .

    缺点:

    • 一些学习曲线 .

    另见:

相关问题