在Java中用于用户身份验证的设计模式

时间:2008-10-26 22:20:21

标签: java design-patterns

跨项目使用某些常见组件:

  1. 用户身份验证和授权
  2. 异常处理
  3. 登录
  4. 电子邮件
  5. 数据库访问
  6. 缓存等
  7. 是否有一致的设计模式可用于这些常见模块?顺便说一下,框架可以像JAAS / JNDI一样用于用户身份验证和授权,log4j / java日志记录用于日志记录,JavaMail用于E-mai,JDBC / Hibernate用于DataBase访问。

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

7 个答案:

答案 0 :(得分:3)

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

作为我与罗德约翰逊的春季训练的一部分,我只是在真正基本的东西中使用过它。

答案 1 :(得分:2)

对于横切问题,您可能需要考虑面向方面编程(AOP)。与设计模式不同,它在您描述的场景中使用。简而言之,您有许多需要安全性的组件......您可以在其他地方定义安全性,并让AOP系统根据需要将其添加到组件中。通过这种方式,您可以围绕核心业务案例设计代码,而无需过多担心安全性。安全性会自动注入。

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

Here是Spring自身关于AOP的文档。

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

答案 2 :(得分:2)

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

如果应用程序部署错误,没有拦截器/方面,会发生什么?嗯,一般来说,你的应用程序可能在很大程度上取决于拦截器提供的功能,并且在没有它的情况下会明显地破坏它。但授权有点不同。如果用户未获得授权,则会发生一些事情,例如提出异常。但在典型情况下,用户被授权,拦截是无操作。当应用程序在没有授权拦截器的情况下意外部署时,它会有效地授权所有操作。

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

在网络应用程序中这很容易,因为它已经通过web.xml加入了servlet容器规范

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

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

答案 5 :(得分:0)

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

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

您怎么看?

答案 6 :(得分:0)

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

如果您决定尝试,则会有Eclipse plugin