自定义 LoginModule 可以是有状态的 ejb 吗?

Posted

技术标签:

【中文标题】自定义 LoginModule 可以是有状态的 ejb 吗?【英文标题】:Can a custom LoginModule be a stateful ejb? 【发布时间】:2012-03-08 04:44:07 【问题描述】:

我正在使用jboss-as-7.1.0.Final-SNAPSHOT 并尝试设置使用数据库的自定义登录模块。我按照 AS7 文档中的说明在standalone.xml 中配置了一个新的安全域,在 jboss-security.xml 中配置了 security-domain,在 web.xml 中配置了 security-constraint,并将 JBoss 的日志记录设置为 TRACE,这样我就可以看到我的正在成功调用自定义登录模块方法(例如 login()、authenticate())。

我不想在我的登录模块中使用手动事务划分,所以如果我的登录模块可以是一个有状态的 ejb,那就太好了。

看看JBoss AS7 : Security Domain Model的文章,上面写着:

只需在代码属性中写入 FQCN,它应该可以开箱即用。

要放置自定义登录模块类文件,您可以将它们放在一个 jar 中并放置:

您的 Web 存档 (war) 或 ejb jar 或企业存档 (ear) 的应用程序类路径或 模块目录下的单独模块。

我可以放置登录模块的位置似乎没有限制,包括在我的应用程序的 EJB 模块中。这是否意味着我的自定义登录模块可以是有状态的 ejb?我没有读过任何说“不”的东西。但是,当我将登录模块部署为有状态的 ejb 注入托管 bean 和注入的 EntityManager 时,似乎没有注入;当我尝试调用它们的方法时,我得到 NullPointerException。

我查看了 org.jboss.security.auth.spi.DatabaseServerLoginModule,它是作为 JBoss 的默认登录模块之一提供的。我想看看那里是如何处理数据库访问的。数据源查找是通过 InitialContext 例如

InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup(dsJndiName);
conn = ds.getConnection();

并且交易都是手动处理的。如果可能,我不想使用这种方法。

我可以使用有状态的 ejb 吗?还是我的方法太离谱了?

【问题讨论】:

【参考方案1】:

问题在JBoss Community上的回答如下:

自定义登录模块不能是有状态 ejb,因为“有状态 EJB 和登录模块各自的生命周期完全不同”,并且“登录模块是在单个身份验证步骤的持续时间内创建和使用的,然后留给垃圾收集。”

自定义登录模块无法使用 CDI,因此无法注入托管 bean。有人说,如果 JAAS 提供了一种注入托管 bean 的方法,那就太酷了,并且有人需要提议更新 JAAS 规范。允许这样做。

【讨论】:

以上是关于自定义 LoginModule 可以是有状态的 ejb 吗?的主要内容,如果未能解决你的问题,请参考以下文章

单一登录使用WebLogic自定义身份验证LoginModule

我正在编写一个 javafx 自定义 LoginModule 并收到以下关于 javafx 权限的 AccessControlException。这是政策文件问题吗?

如何从Glassfish asadmin定义Loginmodule?

拟合自定义(非顺序)有状态 RNN (GRU) 模型

自定义异步IO模块开发

自定义Skype联机/脱机状态