在 Websphere 中使用容器管理的身份验证别名访问 JNDI 数据源Spring + Ibatis/Mybatis

问题描述

我使用的是 WebSphere 8.5.5.18。

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

Security settings screenshot

异常堆栈跟踪:

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)

当设置从组件管理的身份验证更改为容器管理的身份验证别名时,基本上无法正确访问数据库

当我使用组件管理的身份验证运行时,它工作正常。 将安全设置更改为 Container Managed Authentication 别名,是否需要一些其他/额外的设置/更改?或者我是否需要更改我的底层 Spring ibatis 代码才能使其工作?

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

解决方法

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

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

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

// 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 名称的出现可能会有所帮助。