権限管理の概要

Java製のWebアプリケーションでは、ログインにJaveEEレルムを使用する事で権限管理がしやすくなります。 このページでは、Webアプリケーションを作る上での主な用途を、どのように実装すれば良いのかを紹介します。

準備

ここで紹介する権限管理の方法を使うためには、アプリケーションがJavaEEレルムによる認証を使用している必要が有ります。

Apache Tomcat 5.5における設定方法は、レルムと入れ子集合モデルによる組織構造管理を参照してください。 他のサーブレットコンテナにおける設定方法は、その製品のマニュアルを参照してください。

URL単位でのアクセス制限

web.xmlでsecurity-constraint要素に指定する事で、URL単位でのアクセス制限をする事ができます。 これにより、画像ファイル, 外部javascriptファイル, 外部cssファイルなどを非ログイン状態で見せ、 他のコンテンツに対してはログインを要求するように設定する事ができます。

<security-constraint>
  <display-name>Public area</display-name>
  <web-resource-collection>
    <web-resource-name>Static resource area</web-resource-name>
    <url-pattern>/images/*</url-pattern>
    <url-pattern>/scripts/*</url-pattern>
    <url-pattern>/styles/*</url-pattern>
  </web-resource-collection>
</security-constraint>
<security-constraint>
  <display-name>Protected Area</display-name>
  <web-resource-collection>
    <web-resource-name>Context Area</web-resource-name>
    <url-pattern>/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
    <role-name>*</role-name>
  </auth-constraint>
</security-constraint>

Actionクラスレベルでの実行制限

struts-config.xmlでaction要素のroles属性にロール名を列挙しておく事で、そのロールを持つログインユーザしかアクションを実行できないように出来ます。

<action path="/users" type="jp.sourceforge.lepidolite.actions.UsersAction"
    name="form.users" scope="request"
    parameter="default=manipulator,entry"
    roles="administrator">
  <forward name="manipulator" path="tiles.user.manipulator"/>
  <forward name="entry" path="tiles.user.entry"/>
</action>

Tilesレベルでの表示/非表示

tiles-defs.xmlでdefinition要素のrole属性にロール名を列挙しておく事で、<tiles:insert>タグでタイルを指定しても、そのロールを持つログインユーザのときしかインサートを実行しないように出来ます。

<definition name="tiles.devmenu" path="/WEB-INF/jsp/devmenu.jsp"/>

Javaレベルでの分岐

javax.servlet.http.HttpServletRequest#isUserInRole(String)を使用する事で、ログインユーザが特定のロールを持っているか確認する事が出来ます。

  1. if (request.isUserInRole("administrator")) {
  2. // ログインユーザがadministrator権限を持つ場合だけ実行する処理
  3. // ...
  4. }

JSPレベルでの表示/非表示

Strutsの<logic:present>タグのrole属性にロール名を列挙しておく事で、ログインユーザがそのロールを持っているときだけ、中のjspを処理出来ます。 また、<logic:notPresent>タグのrole属性にロール名を列挙しておく事で、ログインユーザがそのロールを持っていないときだけ、中のjspを処理出来ます。

  1. <logic:present role="developer">
  2. <div>
  3. <h2>開発用コマンド</h2>
  4. <ul>
  5. <li><html:link action="/tiles-reload">Tiles再設定</html:link></li>
  6. <li><html:link action="/tiles-view">Tiles設定表示</html:link></li>
  7. </ul>
  8. </div>
  9. </logic:present>