English 中文(简体)
在Java中用什么设计模式进行用户身份验证?
原标题:
  • 时间:2008-10-26 22:20:21
  •  标签:

有特定的共同组件在各个项目中被使用:

  1. User Authentication and Authorization
  2. Exception Handling
  3. Logging
  4. E-mail
  5. DataBase Access
  6. Caching etc

这些常用模块是否都可以使用一致的设计模式?顺便提一句,框架可能会有所不同,例如JAAS/JNDI用于用户认证和授权,log4j/java logging用于日志记录,JavaMail用于电子邮件,JDBC/Hibernate用于数据库访问。

例如,有用于数据库访问的DAO。是否有任何好的设计模式,可用于用户身份验证和授权,无论使用什么框架(JAAS/JNDI/SSO)?

问题回答

也许不是一种模式,但我一直认为Spring的注释方法相当聪明。基本上,您可以注释需要进行安全性操作的方法。只要您具有良好的分层结构,这应该使事情非常简单!它可以为您完成所有艰苦的工作。在这里查看它。 FAQ非常不错

我只是在罗德·约翰逊的春季训练中,将它用于真正初级的内容。

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

这篇文章可能会有帮助。它解释了Spring是如何实现的。我现在正在一个大项目中使用Spring,之前没有它我不知道该怎么办。

这里是Spring关于其AOP的官方文档。

我知道这可能不适用于你提到的每种情况,但这可能是一个开始。

我会谨慎使用面向方面编程,特别是拦截器。拦截器和一些AOP实现在运行时操作,实际上并没有修改运行的代码。

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

相比之下,传统的方法使用显式权限检查将安全性纳入敏感操作本身,因此不依赖于拦截器、过滤器或运行时方面的外部配置。

历史上,当AOP成为一个寻找问题的解决方案时,安全被认为是一个可能的受害者。不幸的是,AOP的粉丝往往忽略了安全应用所需的关键思考。我相信它可以做到,但这并不像注释几个方法那么简单。

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

乍一看与JAAS有关但非常重要,可以使身份验证与应用程序的业务逻辑无关的两个是CallBackHandlersLoginModules

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

这在 Web 应用程序中非常容易实现,因为它已经集成在 Servlet 容器规范中,通过 web.xml 文件。

http://java.sun.com/blueprints/corej2eepatterns/Patterns/InterceptingFilter.html 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

我不知道用户认证/授权设计模式,但是...如果你想要轻松模拟它们,在.NET中我们使用Providers。

然后,我们可以通过配置文件直接配置我们用于身份验证和授权的组件。

你觉得怎么样?

这可能不是你要寻找的,但所有这些功能都是横切关注点的典型示例。AspectJ是一种Java语言扩展,专为以模块化方式处理这些类型的功能而设计。

如果你决定尝试一下,有一个Eclipse插件。





相关问题
热门标签