シーオーリポーツ帳票クリエータ for JavaのWEB APIにユーザ認証機能を追加する(2)Spring Security編

パッケージ製品開発担当の大です。こんにちは。

先週は、2016 Japan IT Weekにおきまして、数多くのお客様に弊社ブースへお立ち寄りいただき、ありがとうございました。私も最終日に参加いたしました。弊社ブースにて製品のご説明をさせていただいたほか、他社様の展示も(駆け足ではありましたが)見せていただき、たいへん勉強になりました。

さて、前回に引き続き、帳票クリエータに認証を追加する方法について書きます。今回は、Spring Securityを使用します。

Spring Securityは、Spring Frameworkのサブプロジェクトで、JavaEEアプリケーションにセキュリティを追加するフレームワークです。アプリケーション全体がSpring Frameworkで構築されていなくても、認証・認可の機能を追加できます。対応している認証の種類も豊富で、BASIC認証・フォーム認証からLDAPやOpenIDにも対応しています。クリックジャッキングやCSRFなどのアタックへの対策がされているのも魅力的です。

下準備

まずは、必要なライブラリを入手します。依存関係が面倒なので、Mavenから持ってくるのが手っ取り早いでしょう。Eclipse(for Java EE Developers)を起動し、ファイル>新規>プロジェクト>Maven>Mavenプロジェクトを選択します。

Mavenプロジェクトの作成

Mavenプロジェクトの作成(クリックで拡大)

ロケーションはどこでもいいです。

ロケーションの選択

ロケーションの選択(クリックで拡大)

フィルターに「webapp」と入力し、出てきたアーキタイプを選択します。

アーキタイプの選択

アーキタイプの選択(クリックで拡大)

グループid、アーティファクトも適当に。

アーキタイプ・パラメータ

アーキタイプ・パラメータ(クリックで拡大)

作成し終わりました。でも、このままだとサーブレット関連のクラスがビルドパスに追加されていなくて、デフォルトで作成されたindex.jspがエラーになっています。プロジェクトを右クリック>プロパティ>プロジェクト・ファセット>動的Webモジュール>ランタイムを選択し、インストールされているランタイム(ここではGlassfish4)を選択します。

ランタイムを選択

ランタイムを選択(クリックで拡大)

これでエラーが出なくなりました。いったんこれで プロジェクトを右クリック>実行>サーバーで実行してみます。

実行結果

実行結果(クリックで拡大)

デフォルトのindex.jspが表示されました。

次に、プロジェクトの直下にある pom.xml に以下を追加します。

<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-web</artifactId>
	<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-config</artifactId>
	<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
	<groupId>commons-logging</groupId>
	<artifactId>commons-logging</artifactId>
	<version>1.2</version>
</dependency>

保存したら、プロジェクトを右クリック>Maven>プロジェクトの更新を行います。必要なライブラリがダウンロードされます。

次に、src/main/webapp/WEB-INF/web.xml を開き、web-appの下に以下を追加します。

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/security.xml</param-value>
</context-param>

<filter>
	<filter-name>springSecurityFilterChain</filter-name>
	<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
	<filter-name>springSecurityFilterChain</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

また、src/main/webapp/WEB-INF/security.xml を作成し、以下のように記述します。

<b:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:b="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.1.xsd">

	<http />

	<user-service>
		<user name="user" password="password" authorities="ROLE_USER" />
	</user-service>

</b:beans>

6行目のようにhttp要素の中身を空にした場合、デフォルトでベーシック認証とフォーム認証が有効になります。

終わったら、もう一度実行してみます。

ログインフォーム

ログインフォーム(クリックで拡大)

ログイン画面が出てきました。Spring Securityのフォーム認証は、デフォルトではこのようなそっけないシンプルなログインフォームが表示されます。ユーザ名「user」とパスワード「password」を入れると、認証が通り、先ほどのHello, World!が表示されます。

帳票クリエータのWEB APIに適用する

今回の構成の場合、hogeアプリは、glassfishのディレクトリの domains/domain1/eclipseApps/hoge にインストールされています。帳票クリエータのWEB APIはdomains/domain1/applications/rdc にインストールされています。

  1. hoge/WEB-INF/web.xmlの、先ほど追記した部分をrdc/WEB-INF/web.xmlに追記します。
  2. hoge/WEB-INF/security.xmlを、rdc/WEB-INF にコピーします。
  3. hoge/WEB-INF/lib 以下のライブラリを、rdc/WEB-INF/libにコピーします。
  4. glassfishの管理画面にて、rdcをreloadします。

DHCで動作確認してみます。まずは普通に http://localhost:8080/rdc/version を取得してみます。

ログインフォームにリダイレクトされる

ログインフォームにリダイレクトされる(クリックで拡大)

302 Foundになりました。Locationヘッダに http://localhost:8080/rdc/login が追加されており、先ほどhogeアプリで出てきたのと同様のログインフォームにリダイレクトされています。

前回と同様に、ベーシック認証のヘッダを追加して再度送信してみます。

認証成功

認証成功(クリックで拡大)

今度は無事に200 OKが返ってきました!