繁体   English   中英

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

[英]What design pattern to use for User Authentication in Java

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

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

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

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

也许不是一种模式本身,但我一直认为弹簧注释方法非常聪明。 基本上,您需要注释需要保护的方法。 如果你有一个很好的分层架构,那么这应该让事情变得非常简单! 它为您完成所有艰苦的工作。 在这里查看 常见问题非常好

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

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

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

以下是Spring自身关于AOP的文档。

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

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

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

相反,使用显式权限检查的传统方法在敏感操作本身中包含安全性,因此它不依赖于拦截器,过滤器或运行时方面支持的外部配置。

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

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

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

我想你在谈论拦截器模式。

它在网络应用程序中很容易,因为它已经通过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

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

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

你怎么看?

这可能不是您想要的,但所有这些功能都是跨领域关注的典型例子。 AspectJ是一种Java语言扩展,专门用于以模块化方式处理这些类型的功能。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM