【问题标题】:What design pattern to use for User Authentication in Java在 Java 中用于用户身份验证的设计模式
【发布时间】:2010-09-19 07:37:09
【问题描述】:

有一些跨项目使用的通用组件:

  1. 用户认证和授权
  2. 异常处理
  3. 日志记录
  4. 电子邮件
  5. 数据库访问
  6. 缓存等

是否有一致的设计模式可用于这些常见模块中的每一个?顺便说一下,该框架可以有所不同,例如用于用户身份验证和授权的 JAAS/JNDI、用于日志记录的 log4j/java 日志记录、用于 E-mai 的 JavaMail、用于数据库访问的 JDBC/Hibernate。

例如,有用于数据库访问的 DAO。无论使用什么框架(JAAS/JNDI/SSO),有没有什么好的设计模式可以用于用户认证和授权?

【问题讨论】:

    标签: java design-patterns


    【解决方案1】:

    我不知道用户身份验证/授权的设计模式,但是...如果您希望能够轻松地模拟它们,在 .NET 中我们使用提供程序。

    然后我们可以直接通过我们的配置文件来配置我们使用哪个组件进行身份验证和授权。

    你怎么看?

    【讨论】:

      【解决方案2】:

      也许本身不是一种模式,但我一直认为 spring 注释方法非常聪明。本质上,您注释需要保护的方法。如果你有一个很好的分层架构,那么这应该会让事情变得非常简单!它为您完成所有艰苦的工作。 Check it out hereFAQ is pretty good

      在我与 Rod Johnson 一起进行的春季训练中,我只在非常初级的东西中使用了它。

      【讨论】:

        【解决方案3】:

        对于横切关注点,您可能需要考虑面向方面的编程 (AOP)。与其说是设计模式,不如说是在您描述的场景中使用。简而言之,您有许多需要安全性的组件……您在别处定义安全性,并让 AOP 系统根据需要将其添加到您的组件中。这样您就可以围绕核心业务案例设计代码,而不必过多担心安全性。安全会自动注入。

        This 文章可能会有所帮助。它解释了它是如何在 Spring 中完成的。我现在在一个大型项目中使用 Spring,我不知道没有它之前我是如何管理的。

        Here 是 Spring 本身关于其 AOP 的文档。

        我知道这可能不适用于您提到的所有场景,但这可能是一个开始。

        【讨论】:

          【解决方案4】:

          这可能不是您想要的,但所有这些功能都是cross-cutting concerns 的典型示例。 AspectJ 是一个 Java 语言扩展,专门设计用于以模块化方式处理这些类型的功能。

          如果您决定试一试,有一个Eclipse plugin

          【讨论】:

            【解决方案5】:

            JAAS 本身指定了一些:Subject、Prinicipal、Credential 和 LoginContext。任何身份验证框架都必须具有类似的类。

            2 乍一看是特定于 JAAS 的,但对于使身份验证独立于应用程序的业务逻辑非常重要的是 CallBackHandlersLoginModules

            【讨论】:

              【解决方案6】:

              我认为您在谈论拦截器模式。

              在 Web 应用程序中非常简单,因为它已经通过 web.xml 融入到 servlet 容器规范中

              http://java.sun.com/blueprints/corej2eepatterns/Patterns/InterceptingFilter.html

              在 j2se 世界中它变得有点棘手......好像你想让一切都完全无缝你可以使用动态代理(想想 spring 事务 daos)http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/Proxy.html

              【讨论】:

                【解决方案7】:

                我会警惕使用面向方面的编程,尤其是拦截器。拦截器和 AOP 的一些实现在运行时运行,实际上并不修改运行的代码。

                如果应用程序部署不正确,没有拦截器/方面,会发生什么?好吧,一般来说,您的应用程序可能在很大程度上依赖于拦截器提供的功能,如果没有它,将会明显中断。但是授权有点不同。如果用户没有被授权,就会发生一些事情,比如引发异常。但在典型情况下,用户被授权,拦截是无操作的。当应用程序在没有授权拦截器的情况下意外部署时,它会有效地授权所有操作。

                相比之下,使用explicit permission checks 的传统方法在敏感操作本身中加入了安全性,因此它不依赖于拦截器、过滤器或运行时方面支持的外部配置。

                从历史上看,当 AOP 是寻找问题的解决方案时,安全性被视为可能的受害者。不幸的是,AOP 爱好者倾向于忽视将其安全地应用于这一重要功能所需的批判性思维。我相信是可以做到的,但并不是注解几个方法那么简单。

                【讨论】:

                • 在我们使用 WebSphere 的安全性对 Web 服务请求进行签名的场景中,我们实际上做了一些事情来帮助解决这个问题。一旦我们进入我们的代码,我们做的第一件事就是将用户映射到一个拥有 privs 的应用程序用户。如果我们不能进行映射,我们会抛出一个错误。同样的解决方案?
                • 是的,这是一种主动验证,需要安全地将 AOP 用于通常是被动功能的功能。这可能听起来偏执或过于谨慎......但这就是良好的安全性。
                猜你喜欢
                • 1970-01-01
                • 2021-10-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-08-24
                • 2010-11-09
                相关资源
                最近更新 更多