Cognos カスタム認証(JDBCSample)について
Cognos SDKで認証機能を実装するカスタム認証(JDBCSample)については、こちらの記事をご参照ください。
Cognos SDK でカスタム認証プロバイダーを開発する時に参考になるJDBCSampleの説明
https://qiita.com/shinyama/items/33b6349916380b8fe960
このサンプルとして提供されているJDBCSampleですが、ユーザー情報を保持するデータベースはDb2とSQL Serverのみで、Oracleをソースとしてやってみるとエラーとなり動きません。
とはいえ、全社的にOracleを標準データベースとしているお客様環境は多々あり、Cognosのカスタム認証でもOracleを使用してもらわないと困る、という事があります。
Oracleでカスタム認証が動くように修正しましたので、修正箇所を共有します。
ただし、個人的に動くものを作ったというだけですので、これが正式なものではなく、不具合があってもサポートされるものではないので、あくまで参考としてご活用ください。
Oracle用テーブル定義
USERS表
varchar2に統一しています
create table USERS (
USERID varchar2(8) not null ,
USERNAME varchar2(255) not null ,
PASSWORD varchar2(255) not null ,
FULLNAME varchar2(255) ,
EMAIL varchar2(255) ,
LOCALE varchar2(5) ,
TENANT varchar2(128)
);
alter table USERS add constraint PK_USERS primary key (USERID);
GROUPS表
varchar2に統一しています
create table GROUPS (
GROUPID varchar2(8) not null,
GROUPNAME varchar2(255) NOT NULL,
USERID varchar2(8),
TENANT varchar2(128) not null
);
OBJECTVIEWビュー
変更なし
Javaソース
すいません、以下のサンプルとのdiff結果で読み取って下さい。
基本はテーブル定義のintegerをvarchar2に変更した対応です。
比較対象の.org拡張子のファイルが、Db2&SQL Server版のデフォルトサンプルです。
AccountCache.java
# diff AccountCache.java AccountCache.java.org
43,44c43,44
< final String userID = account.getObjectID().substring(2);
< // final Integer userID = Integer.parseInt(userIDStr.substring(2));
---
> final String userIDStr = account.getObjectID();
> final Integer userID = Integer.parseInt(userIDStr.substring(2));
GroupCache.java
# diff GroupCache.java GroupCache.java.org
45,46c45,46
< final String groupID = group.getObjectID().substring(2);
< // final Integer groupID = Integer.parseInt(groupIDStr.substring(2));
---
> final String groupIDStr = group.getObjectID();
> final Integer groupID = Integer.parseInt(groupIDStr.substring(2));
QueryUtil.java
# diff QueryUtil.java QueryUtil.java.org
10d9
< import java.math.BigDecimal;
137c136
< return (String) row[0];
---
> return String.valueOf(row[0]);
383,384c382,383
< final boolean bIsUser = ((BigDecimal) row[isUserCol]).intValue() == 1;
< final boolean bIsGroup = ((BigDecimal) row[isGroupCol]).intValue() == 1;
---
> final boolean bIsUser = ((Integer) row[isUserCol]).intValue() == 1;
> final boolean bIsGroup = ((Integer) row[isGroupCol]).intValue() == 1;
410c409
< final String objectID = (String) row[0];
---
> final String objectID = String.valueOf(row[0]);
452c451
< final String groupID = (String) row[0];
---
> final String groupID = String.valueOf(row[0]);
JDBC_Config_Restorable.properties ファイル
# For Oracle connections
connectionString=jdbc:oracle:thin:@OracleHost:1521:ORCL
driverClass=oracle.jdbc.driver.OracleDriver
username=orauser
password=password
singleSignon=true