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

Database 如何处理数据库中用户的身份验证/授权?,database,jsf,jakarta-ee,authentication,authorization,Database,Jsf,Jakarta Ee,Authentication,Authorization,目前,我正在使用JSF2.0、Tomcat7和MongoDB进行一个web项目。我有一个大问题,就是如何处理数据库中用户的会话管理和身份验证/授权 我想要的结构如下:只有登录的用户才能创建事件,每个人都可以看到创建的事件 create.xhtml-->仅适用于登录用户 events.xhtml-->对所有人公开 我计划的基本结构是: 检查页面是否需要登录用户(例如,create.xhtml) 如果是,请检查用户是否已登录 如果用户未登录,请转到login.xhtml 如果成功登录,请返回请

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

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

  • create.xhtml
    -->仅适用于登录用户
  • events.xhtml
    -->对所有人公开
我计划的基本结构是:

  • 检查页面是否需要登录用户(例如,
    create.xhtml
  • 如果是,请检查用户是否已登录
  • 如果用户未登录,请转到
    login.xhtml
  • 如果成功登录,请返回请求页面
  • 保留“用户已登录”信息,除非用户单击“注销” 按钮(我猜
    @SessionScoped
    在这里发挥作用)
问题是:

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

  • 有几种选择。选择哪一个完全取决于你。客观地权衡具体的利弊,以符合你自己的情况


    1.使用提供的JavaEE 只需在
    web.xml
    中声明一个
    ,它引用在servletcontainer中配置的安全域。您可以为您的Web应用指定URL模式,该模式应检查登录和/或角色,例如
    /secured/*
    /app/*
    /private/*

    不幸的是,在JavaEE8之前,您仍然需要以特定于servletcontainer的方式配置安全领域。它通常在特定于servletconainer的文档中描述。在Tomcat8的例子中,这是最重要的。例如,“JDBCRealm”一节描述了基于用户/角色表的基于数据库的领域

    自JavaEE8以来,最终将有一个基于的标准API

    优势:
    • 相对快速且易于安装和使用
    • 自从JavaEE8之后,终于有了一个健壮灵活的标准API
    缺点:
    • 在JavaEE8之前,领域配置是特定于容器的。在JavaEE8中,新版本应该在的帮助下解决这个问题
    • 在JavaEE8之前,没有细粒度的控件
    • 在JavaEE8之前,它是非常斯巴达的;没有“记住我”,错误处理能力差,没有基于权限的限制
    另见:
    • -包含完整的代码示例
    • -示例web应用程序(由我开发),它还演示了Java EE 8身份验证(JSR-375 RI)

    2.家庭种植 这允许更细粒度的控制,但是您需要自己编写所有代码,并且您应该真正了解/理解应该如何实现这样的过滤器以避免潜在的安全漏洞。例如,在JSF端,您可以通过
    sessionMap.put(“user”,user)
    将登录用户作为会话属性,如果
    session.getAttribute(“user”)
    不是
    null
    ,则检查过滤器

    优势:
    • 细粒度控制
    • 完全独立于容器
    缺点:
    • 车轮的改造;新特性需要大量代码
    • 作为初学者,您永远无法确定代码是否100%健壮
    另见:
    • -包含用于身份验证的介绍性说明和启动示例
    • -包含更多扩展的身份验证启动示例,其中还包括ajax请求
    • -包含授权的启动示例

    3.调整第三方框架 例如,等等。这通常提供比标准容器管理的身份验证更细粒度的配置选项,并且您不需要自己为此编写任何代码,当然除了登录页面和一些(XML)配置

    优势:
    • 细粒度控制
    • 完全独立于容器
    • 没有重新发明车轮;最低限度的自己的代码
    • 经过大量用户的全面开发和测试,因此很可能100%健壮
    缺点:
    • 一些学习曲线
    另见:
    • -关于在JSF2 webapp中集成Shiro的详细教程

    亲爱的@BalusC,我使用servlet过滤器将用户限制为特定视图(URL)。我担心表现。我使用primefaces,有时单击按钮或更新元素会多次调用过滤器(我猜是因为内部ajax请求)。有没有办法减少或更好地处理这么多对筛选器的调用?。另外一个问题是,当使用页面转发而不是重定向时,筛选器获取的请求url总是相同的,这使得限制用户变得更加困难。@CristianArteaga:Thst实际上是stackoverflow的一个新问题。如果你把它贴出来,我相信你会得到答案的