シーオーリポーツ帳票クリエータ 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プロジェクトを選択します。
ロケーションはどこでもいいです。
フィルターに「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 にインストールされています。
- hoge/WEB-INF/web.xmlの、先ほど追記した部分をrdc/WEB-INF/web.xmlに追記します。
- hoge/WEB-INF/security.xmlを、rdc/WEB-INF にコピーします。
- hoge/WEB-INF/lib 以下のライブラリを、rdc/WEB-INF/libにコピーします。
- glassfishの管理画面にて、rdcをreloadします。
DHCで動作確認してみます。まずは普通に http://localhost:8080/rdc/version を取得してみます。
302 Foundになりました。Locationヘッダに http://localhost:8080/rdc/login が追加されており、先ほどhogeアプリで出てきたのと同様のログインフォームにリダイレクトされています。
前回と同様に、ベーシック認証のヘッダを追加して再度送信してみます。
今度は無事に200 OKが返ってきました!