但这是否违反了“容器管理身份验证”的整个范式,并且可能会插入安全漏洞?
是的,或多或少。容器管理的安全概念,其中应用程序完全不知道身份验证机制和身份存储(用户数据实际存储的位置)并没有真正考虑应用程序有自己的用户注册/注册功能。
这个想法似乎更倾向于将外部获得的应用程序(例如 Sonar 或 JIRA 实例)集成到现有的企业结构中。那里的用户是由管理员使用像 LDAP 这样的中央系统创建的,或者在某些情况下甚至是应用程序服务器的管理 UI。
不幸的是,许多典型的公共 Web 应用程序并不属于这种类型。它们是独立的应用程序(不与现有的内部企业基础架构集成),并且可以有效地管理自己的用户。
经典的概念在这里并不合适,这就是为什么 Java EE Security EG 目前正在探索如何最好地解决这个问题。
您基本上同时拥有三个“解决方案”:
- 只需定义您的数据库连接详细信息两次,一次在服务器级别,一次在应用程序。看起来你确实已经这样做了。
- 使用 JASPIC,这是一个容器提供的身份验证 API,它可以让应用程序包含身份验证模块。它可以使用完全相同的数据源和可能的 JPA 实体管理器,并且应用程序也在使用它。
- 使用完全在“用户空间”中实现的外部安全框架,例如 DeltaSpike Security 或 Shiro,确保您的安全。
从 Java EE 的角度来看,没有一个是真正理想的。第一个有重复的定义,确实有点违反原则,第二个本身还可以,但是 JASPIC 级别有点低,第二个是一个丰富的解决方案,但与现有的 Java EE 安全性没有很好的集成。