Cognos SDK でカスタム認証プロバイダーを開発する時に参考になるJDBCSampleの説明

##概要
Cognosを全く知らないけど、Javaを書けるというだけで、突然Cognosのカスタム認証プロバイダーの開発をやる事になってしまう方が良くいらっしゃいます。
カスタム認証プロバイダーとは、Cognos SDKのJavaでコーディングして、Cognosの認証・認可の機能自体を作ってしまうという話です。
通常Cognosでは、認証・認可のユーザー情報はLDAPに存在するものを利用しますが、LDAPを持っていないなど、なんらかの理由でユーザー情報をデータベースのテーブルに保持して、認証・認可を行いたい時などにカスタム認証プロバイダー(CJAP)は登場します。

このパターンで開発を行う場合、一から全てコードを書くという事はほぼ無く、JDBCSampleという、Cognos SDKのCJAPサンプルを元に開発するのが常です。

さて、そのJDBCSampleというのものを読み解く事から開発が始まりますが、Cognosを知らん人にはとってもわかりにくいと思いますので、読み取りポイントを投稿しておきたいと思います。

##カスタム認証プロバイダー(JDBCSample)の構成
まず、Cognos SDKというモジュールをインストールする必要がありますが、インストールすると、以下のディレクトリにJDBCSampleが配置されます。
C:\Program Files\ibm\cognos\c10_64\sdk\java\AuthenticationProvider\JDBCSample

この中に、dbInit_db2.sql という、DB2用のテーブル作成DDLがあるので、これを流すと、ユーザー・グループ情報を保持するサンプル用のテーブルが作成できます。
![014.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/24cc49e4-3d55-b7a0-b683-affc854b497c.png)

同フォルダ上のbuild.batで、ビルドをするとCAM_AAA_JDBCSample.jarができあがるので、これを以下のフォルダに配置します。
C:\Program Files\ibm\cognos\c10_64\webapps\p2pd\WEB-INF\lib
※他にも諸々手順ありますが、詳細は以下のリンクを参照してください。
http://qiita.com/shinyama/items/1f9c7842a3966233a5d7

![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/c7388c9d-ccf1-c4b9-e878-0864e15b4d86.png)

そしてCognos Configurationの認証でカスタムJavaプロバイダーのネームスペースを作成し、Javaクラス名に RestorableJDBCSample を指定すると、このクラスがメインクラスとして、認証時に呼び出されます。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1684e65c-f1f7-3d14-7e71-9352140e63cf.png)

さて、ようやく本題ですが、このRestorableJDBCSampleクラスの読み解きが肝ですので、以降に記載します。

##RestorableJDBCSampleクラス
RestorableJDBCSampleクラスのソースは、以下にありますので開いてみましょう。
C:\Program Files\ibm\cognos\c10_64\sdk\java\AuthenticationProvider\JDBCSample\RestorableJDBCSample.java

**initメソッド**
まず簡単なところから、222行目からの init メソッドです。
![013.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2e3eb4ca-a982-b930-284d-2820bca68da6.png)

これはサービスなどから、Cognosプロセスを起動したタイミングで読み込まれるメソッドです。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/a576f0c4-aee8-6f68-c54a-3809f5a0f3a1.png)

**logoffメソッド**
次も簡単な、113行目からのlogoffメソッドです。
![011.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/3da6e971-583e-2c19-e27c-5f02bacff8c6.png)

Cognosにログインすると、こんなポータル画面(Cognos Connection)になるのですが、赤枠にある「ログオフ」という文字をクリックして、文字通りCognosからログオフする時に呼ばれるメソッドです。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/ecc06732-ad2d-d5c3-2184-da3100f56c29.png)

**logonメソッド**
さて、次の54行目から始まるlogonメソッドが肝です。
当然ながらCognosにログインする時に呼ばれるメソッドですが、ソースを見ていると赤〇で示した、①getTrustedCredentialValues、②getCredentialValues、③getFormFieldValues、④getTrustedEnvironmentVaribleValue、って何でしょう、という話になります。
![015.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/cb827ac5-d5b1-8f74-d6e8-b34cc7b6e698.png)

①getTrustedCredentialValuesとは
Cognosには、レポートを定期的に実行して、PDFに保存するとかする、スケジュールの機能があります。
こういう各レポートのエントリーの横にある、赤枠のアイコンでスケジュールを設定できます。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1eb790e0-149e-2119-c059-182a03ceef76.png)

アイコンをクリックすると、以下のような画面になり、いつ・どういう形式でレポートを実行するかなど、設定ができます。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/7828d324-8da5-0d19-d7b0-6de0f389a678.png)

この設定を行うと、設定時刻になるとレポートが実行されるわけですが、レポート実行は誰のユーザーIDで行われるかというと、スケジュールを設定したユーザーのIDで、この設定時刻のレポート実行のタイミングで、実はこのユーザーIDで認証が走るイメージです。
スケジュール設定をした時にユーザー情報は保持されているのですが、それを呼び出して受け取るのが、このgetTrustedCredentialValuesになります。

②getCredentialValuesとは
こちらは、Cognos SDKでなんらかCognosを操作するためのプログラムを作成し、プログラムを外部から実行する時に、Cognosのアクセス時に認証を行う際に呼び出されます。
Cognos SDKの外部呼出しのプログラムなんて作ってないよ、という話であれば無視です。

③getFormFieldValuesとは
外部のWebページとか、Cognos Mashup ServiceからCognosにアクセスする際に、入力されたユーザーIDとパスワードを受け取る機能です。

④getTrustedEnvironmentVaribleValue
CognosでSSO(Single Sign On)を行う時には、基本的にHTTP Headerの環境変数に組み込まれたユーザーID情報を元にSSOを行いますが、こちらはカスタム認証でHTTP Headerの環境変数を受け取り、SSOを行うためのものです。

というあたりを覚えておくと、logonメソッドの読み取りが非常に楽になります。

**searchメソッド**
最後に、134行目から始まるsearchメソッドです。
![012.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/a5a6e0bd-79a8-c33f-2a51-41c9909bb793.png)

Cognosで、権限付与などの認可の行為を行う時に、あるグループにユーザーを所属させたりとか、認証ソース上のユーザーを検索する事を行います。
こんな感じのCognos Administrationという管理画面で、「作成者」というグループにメンバーを登録しようとしています。赤枠の追加を押します。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/5bd0cdee-8b90-5a28-c68a-a9e1f7953ae7.png)

するとこんな感じに認証ソース(Restorable)中のユーザー情報が参照できます。
右上の方に、もっと細かく条件指定してユーザーを検索する、「入力」「検索」という機能がありますが、これらの機能を実装するのもsearchメソッドの役割です。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/56ffff8e-46a2-665e-760a-d4a6630f9aa0.png)

ざっとですが、以上です。

実際のCognosの画面上の機能と、ソースコードの記載のマッピングを理解しないと開発は始められないので、カスタム開発の最初の一歩のお役に立てればと思います。