S2AnA

主にJ2EEコンテナによって提供されているAuthentication(認証)とAuthorization(承認)の機能を、Seasarから簡単に使用することを目的としたプロジェクトです。 S2AnAの"AnA"は、Authentication and Authorizationの略です。

概要

S2AnAは大きく2つ、認証系(authentication)と承認系(authorization)に分かれます。

  • 認証(authentication)とは、システムにアクセスしているユーザ(正しくはPrincipalといいます)が誰であるかの識別と特定を行う機能です。
  • 承認(authorization)とは、ユーザが特定の対象物に対してアクセスする権限があるかどうかを調べ、アクセスを許可あるいは拒否する機能です。

(注) 認証された情報は正しくはPrincipalですが、このドキュメントでは簡単に理解していただくためにPrincipalのことをユーザと書いております。実際のPrincipalは人間だけでなく組織や機械を指し示すこともあります。

認証系機能

AuthenticationContextインターフェイス

認証系と承認系を結ぶためのインターフェイスです。コンテナや個々のアプリケーションで認証した情報に対して、S2AnAはこのインターフェイスを通じてアクセスします。 実装する場合には、以下のメソッドを実装する必要があります。

  • getUserPrincipal : Principal
  • isAuthenticated : boolean
  • isUserInRole(String roleName) : boolean

なお、AuthenticationContextの簡易実装としてRequestDelegatingAuthenticationContextを提供しています。

RequestDelegatingAuthenticationContext

HttpServletRequestを介してWebApplicationのRealm認証情報へのアクセスを行うコンポーネントです。使用するにあたっては、web.xmlにs2filterが設定されていることが前提条件となります。

diconファイルへの記述例

   <component
       name="authenticationContext"
       class="org.seasar.security.authentication.servlet.RequestDelegatingAuthenticationContext"
       instance="request"
   />

なお、WebApplicationのRealm認証情報へのアクセスを行う実装はs2-ana-provider-webcontainerとしてパッケージングされています。 s2-ana-provider-webcontainerを使用する際には、s2ana-provider-webcontainer.diconをs2ana.diconファイルにincludeするようにしてください。

s2ana.diconファイルへの記述例

   <include path="s2ana-provider-webcontainer.dicon" />

承認系機能

現在3つのinterceptorをS2AnAで用意しています

  • AuthenticatedAccessOnlyInterceptor
  • AllowInterceptor
  • DenyInterceptor

これら承認系のinterceptorに対して、AuthenticationContextがインジェクトされます。

AuthenticatedAccessOnlyInterceptor

「認証されているかどうか」をチェックするinterceptorです。インジェクトされているAuthenticationContextのisAuthenticatedメソッドを使用して、既に認証が行われているかどうかを検査します。

AuthenticationContext#isAuthenticatedがfalseを返す場合にはSNotAuthenticatedExceptionを投げます。 この例外をキャッチしてログイン画面等に遷移させるのが典型的な使用例となります。

diconファイルへの記述例

<component name="authenticatedAccessOnly"
   class="org.seasar.security.authorization.AuthenticatedAccessOnlyInterceptor"/>

AllowInterceptor,DenyInterceptor

インジェクトされているAuthenticationContextのisUserInRoleメソッドを使用して、アクセスしているユーザが指定されたロールに属しているかどうかを検査します。

  • AllowInterceptorは指定されたロールに属しているユーザのアクセスのみを許可します
  • DenyInterceptorは指定されたロールに属しているユーザのアクセスを拒否します

AllowInterceptorにアクセスが許可されなかったか、またはDenyInterceptorにアクセスが拒否された場合には、SAccessDeniedExceptionが投げられます。

AllowInterceptor,DenyInterceptorのdiconファイルへの記述方法は(FQCNを除いては)共通です。

記述例:単一のロールを指定する

<component class="org.seasar.security.authorization.AllowInterceptor">
  <arg>"roleA"</arg>
</component>

記述例:複数のロールを指定する

<component class="org.seasar.security.authorization.AllowInterceptor">
  <arg>{"roleA","roleB"}</arg>
</component>

記述例:セッターインジェクションで設定を行う

<component class="org.seasar.security.authorization.AllowInterceptor">
  <initMethod name="addRoleName">
    <arg>"roleA"</arg>
  </initMethod>
</component>

記述例:メソッドインジェクションで設定を行う

<component class="org.seasar.security.authorization.AllowInterceptor">
  <initMethod>#self.addRoleName("roleA")</initMethod>
  <initMethod>#self.addRoleName("roleB")</initMethod>
  <initMethod>#self.addRoleName("roleC")</initMethod>
  <initMethod>#self.addRoleName("roleD")</initMethod>
</component>

開発者

t-wada[http://d.hatena.ne.jp/t-wada/]と申します。よろしくお願いします。

開発情報

RFPは、こちら[http://d.hatena.ne.jp/koichik/20041122#1101145610]

依存ライブラリについて

S2AnAはS2コアとS2AOPに依存します。そのほかの依存関係はありません。

コメント

最新の10件を表示しています。 コメントページを参照

  • 非常に興味があります。S2AnAを実装したWEBアプリケーションのサンプルはございますでしょうか。 -- fe? 2006-05-30 (火) 00:52:41
  • 返答遅れまして非常に申し訳ございません。現時点ではサンプルアプリケーションは残念ながら出来ておりません。9月のイベントまでに他プロダクトとの連携も含めたサンプルをリリースすることを考えております。 -- t-wada? 2006-07-04 (火) 02:16:36
  • ご回答いただきまして、ありがとうございます。楽しみにしておりますので、よろしくお願いします。 -- fe? 2006-07-09 (日) 06:22:07
お名前:

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-04-03 (月) 22:20:50 (4009d)