首页 > 解决方案 > 在 Websphere 中使用容器管理的身份验证别名访问 JNDI 数据源(Spring + Ibatis/Mybatis)

问题描述

我正在使用 WebSphere 8.5.5.18。

截至目前,我正在为我的数据源使用组件管理的身份验证别名。但我想改用容器管理。当我只是更改数据源安全设置中的安全设置时,我在日志中收到错误。它无法获取记录。

安全设置截图

异常堆栈跟踪:

Check the SQL Statement (preparation failed).  
--- Cause: java.sql.SQLException: [jcc][t4][10205][11234][3.72.54] Null userid is not supported. ERRORCODE=-4461, SQLSTATE=42815 DSRA0010E: SQL State = 42815, Error Code = -4,461
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:97)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:212)
    at org.springframework.orm.ibatis.SqlMapClientTemplate.queryForObject(SqlMapClientTemplate.java:271)

基本上,当设置从 Component-Managed Authentication 更改为 Container-Managed Authentication 别名时,无法正确访问数据库。

当我使用组件管理的身份验证运行时,它工作正常。将安全设置更改为容器托管身份验证别名是否需要一些其他/附加设置/更改?或者我是否需要更改我的基础 Spring ibatis 代码才能使其工作?

任何有关在 websphere 中配置/实施容器管理的身份验证别名的帮助将不胜感激。

标签: webspheredatasourceibatisjaas

解决方案


当您的代码(或代表它执行的任何第三方代码)使用将资源身份验证指定为容器或未指定资源身份验证的资源引用查找数据源时,将应用容器管理的身份验证,在这种情况下,它默认为容器。

当您的代码(或代表它执行的任何第三方代码)在没有资源引用的情况下查找数据源,或使用将资源身份验证指定为应用程序的资源引用时,组件管理的身份验证适用。

以下是一些使用容器身份验证的资源引用示例:

// resource injection can be used on a web component (servlet) or ejb component
@Resource(name = "java:comp/env/jdbc/ds1ref", lookup = "jdbc/ds1", authenticationType = Resource.AuthenticationType.CONTAINER)
DataSource ds1;

@Resource(name = "java:comp/env/jdbc/ds2ref", lookup = "jdbc/ds2")
DataSource ds2;

...
// code that looks up one of the above resource references
DataSource ds = InitialContext.doLookup("java:comp/env/jdbc/ds1ref");

以下是在 web.xml 部署描述符中定义的资源引用示例:

<resource-ref>
  <res-ref-name>java:comp/env/jdbc/ds3ref</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
  <lookup-name>jdbc/ds3</lookup-name>
</resource-ref>

如果第三方代码(例如 Spring)代表您查找数据源,并且您希望它使用容器身份验证,则需要使用容器管理身份验证定义资源引用,如上面示例中所示,并且将其资源引用名称提供给第三方软件,而不是您当前正在这样做。如果您不确定这是在哪里完成的,那么在应用程序中搜索 WebSphere 数据源的已配置 JNDI 名称的出现可能会有所帮助。


推荐阅读