[英]What design pattern to use for User Authentication in Java
跨项目使用某些常见组件:
是否有一致的设计模式可用于这些常见模块中的每一个? 顺便说一下,框架可以像JAAS / JNDI一样用于用户身份验证和授权,log4j / java日志记录用于日志记录,JavaMail用于E-mai,JDBC / Hibernate用于DataBase访问。
例如,有DAO用于数据库访问。 无论使用什么框架(JAAS / JNDI / SSO),是否有任何可用于用户身份验证和授权的良好设计模式?
我会谨慎使用面向方面的编程,尤其是拦截器。 拦截器和AOP的一些实现在运行时运行,并不实际修改运行的代码。
如果应用程序部署不正确,没有拦截器/方面会发生什么? 嗯,一般来说,你的应用程序可能在很大程度上取决于拦截器提供的功能,并且在没有它的情况下会明显地破坏它。 但授权有点不同。 如果用户未获得授权,则会发生一些事情,例如提出异常。 但在典型情况下,用户被授权,拦截是无操作。 当应用程序在没有授权拦截器的情况下意外部署时,它会有效地授权所有操作。
相反,使用显式权限检查的传统方法在敏感操作本身中包含安全性,因此它不依赖于拦截器,过滤器或运行时方面支持的外部配置。
从历史上看,当AOP是寻找问题的解决方案时,安全被视为可能的受害者。 不幸的是,AOP粉丝倾向于低估将安全应用于这一重要功能所需的批判性思维。 我相信它可以做到,但它并不像注释几种方法那么简单。
JAAS本身指定了一些: Subject,Prinicipal,Credential和LoginContext 。 任何身份验证框架都必须具有类似的类。
2乍一看特定于JAAS,但对于使身份验证独立于应用程序的业务逻辑非常重要的是CallBackHandlers和LoginModules 。
我想你在谈论拦截器模式。
它在网络应用程序中很容易,因为它已经通过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。
然后,我们可以直接通过配置文件配置我们用于身份验证和授权的组件。
你怎么看?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.