name.Caution本バージョンの内容は既に古くなっています。最新のガイドラインはこちらからご参照ください。Securityで提供している認可機能を説明する。Securityの認証機能を用いることを前提とする。Securityを利用した認証方法については、認証を参照されたい。アクセス認可の対象のリソースは、以下の3項目である。Securityでは、設定ファイルやアノテーションでアクセス認可情報を記述し、機能を実現している。Securityのフィルタチェーンが割り込み処理を行う。認可制御の対象となるURLとリクエストのマッチングを行い、アクセス認可マネージャにアクセス認可の判断を問い合わせる。必要なロールが割り当てられていない場合は、アクセス拒否例外をスローする。必要なロールが割り当てられている場合は、処理を継続する。Authorization(JSP)JSPから生成されたサーブレットが、アクセス認可マネージャに問い合わせる。必要なロールが割り当てられていない場合は、タグの内部を評価しない。必要なロールが割り当てられている場合は、タグの内部を評価する。Authorization(Method)Springコンテナがアクセス認可情報をもとに、対象のオブジェクトに対してインターセプタを生成、割り込みさせる。インターセプタは設定されたロールをもとにアクセス認可マネージャに問い合わせる。必要なロールが割り当てられていない場合はアクセス拒否例外をスローする。必要なロールが割り当てられている場合は、処理を継続する(設定により、処理を実行した後に権限をチェックすることもできる)。use¶アクセス認可(リクエストURL)、アクセス認可(JSP)、アクセス認可(Method)の使用方法について説明する。Securityの設定ファイルに記述する内容を以下に示す。Security概要を参照されたい。<sec:intercept-url>要素の設定¶<sec:http>要素の子要素である<sec:intercept-url>要素に制御対象とするURL、認可するロールを記述することで、URLのパス単位で認可制御を行うことができる。以下に、設定例を記載する。説明patternアクセス認可を行う対象のURLパターンを記述する。ワイルドカード「*」、「**」が使用できる。「*」では、同一階層のみが対象であるのに対し、「**」では、指定階層以下の全URLが、認可設定の対象となる。EL式でのアクセス制御式や、アクセス可能なロールを指定する。methodHTTPメソッド(GETやPOST等)を指定する。指定したメソッドのみに関して、URLパターンとマッチングを行う。指定しない場合は、任意のHTTPメソッドに適用される。RESTを利用したWebサービスの利用時に活用できる。requires-channel「http」、もしくは「https」を指定する。指定したプロトコルでのアクセスを強制する。指定しない場合、どちらでもアクセスできる。<intercept-url>を参照されたい。ログインユーザーに「ROLE_USER」「ROLE_ADMIN」というロールがある場合を例に、設定例を示す。説明(1)「/reserve/*」にアクセスするためには、「ROLE_USER」もしくは「ROLE_ADMIN」ロールが必要である。hasAnyRoleについては、後述する。(2)「/admin/*」にアクセスするためには、「ROLE_ADMIN」ロールが必要である。hasRoleについては、後述する。権限設定が記述されていないURLに対してはどのユーザもアクセス出来ない設定としている。denyAllについては、後述する。マッチしたパターンに対してアクセス認可を行う。そのため、パターンの記述は、必ず、より限定されたパターンから記述すること。EL式は真偽値で評価され、式が真の場合に、アクセスが認可される。以下に、使用例を示す。説明(1)hasRole('ロール名')を指定することで、ログインユーザが指定したロールを保持していれば真を返す。hasRole('ロール名')ユーザが指定したロールを保持していれば、真を返す。hasAnyRole('ロール1','ロール2')ユーザが指定したいずれかのロールを保持していれば、真を返す。permitAll常に真を返す。認証されていない場合も、アクセスできることに注意する。denyAll常に偽を返す。isAnonymous()匿名ユーザであれば、真を返す。isAuthenticated()認証されたユーザならば、真を返す。isFullyAuthenticated()匿名ユーザ、もしくはRememberMe機能での認証であれば、偽を返す。hasIpAddress('IPアドレス')リクエストURL、およびJSPタグへのアクセス認可のみで、有効となる。指定のIPアドレスからのリクエストであれば、真を返す。expressionsを参照されたい。演算子を使用した判定も行うことができる。以下の例では、ロールと、リクエストされたIPアドレス両方に合致した場合、アクセス可能となる。[式2]式1、式2が、どちらも真の場合に、真を返す。[式2]いずれかの式が、真の場合に、真を返す。![式]式が真の場合は偽を、偽の場合は真を返す。アクセス認可制御を行わないURLの設定¶トップページやログイン画面、cssファイルへのパスなど、認証が必要のないURLに対しては、http要素のpattern属性、およびsecurity属性を利用する。説明(1)pattern属性に設定を行う対象のURLパターンを記述する。pattern属性を記述しない場合、すべてのパターンにマッチする。Securityフィルタチェインを回避することができる。認可されていないURLにアクセスした場合、org.springframework.security.access.AccessDeniedExceptionがスローされる。デフォルトの設定では、org.springframework.security.web.access.ExceptionTranslationFilterに設定されたorg.springframework.security.web.access.AccessDeniedHandlerImplが、エラーコード403を返却する。http要素に、アクセス拒否時のエラーページを設定することで、アクセス拒否時に指定のエラーページに遷移させることができる。説明(1)<sec:access-denied-handler>要素のerror-page属性に、遷移先のパスを指定する。Securityが提供しているカスタムJSPタグ<sec:authorize>を利用する。%>のタグライブラリの使用宣言設定をされていることが、前提条件である。accessアクセス制御式を記述する。真であれば、タグ内が評価される。url設定したURLに対して権限が与えられている場合に、タグ内が評価される。リンクの表示の制御等に利用する。methodHTTPメソッド(GETやPOST等)を指定する。指定したURLパターンとマッチングを行う。指定しない場合、GETが適用される。ifAllGranted設定したロールが全て与えられている場合に、タグ内が評価される。ロール階層機能は効かない。ifAnyGranted設定したロールについて、いずれかが与えられている場合に、タグ内が評価される。ロール階層機能は効かない。ifNotGranted設定されたロールが与えられていない場合、タグの中身が評価される。ロール階層機能は効かない。varタグの評価結果を格納するpageスコープの変数を宣言する。同等の権限チェックをページ内で行う場合に利用する。以下に、<sec:authorize>タグの使用例を示す。説明(1)「ROLE_USER」を持つ場合のみ、タグ内が表示される。(2)「/admin/menu」に対してアクセスが認可されている場合、タグ内が表示される。Warning<sec:authorize>タグによる認可処理は、画面表示の制御でしかないため、特定の権限でリンクを表示されなくても、URLが推測されれば、直接リンク先のURLにアクセスできてしまう。そのため、必ず、前述の「アクセス認可(リクエストURL)」、もしくは、後述の「アクセス認可(Method)」を併用して、本質的な認可制御をに行うこと。アクセス認可(Method)¶メソッドに対して、認可制御ができる。SpringのDIコンテナで管理されているBeanが、認可の対象となる。前述の2つの認可方法はアプリケーション層での認可制御であったが、メソッドレベルの認可制御はドメイン層(Serviceクラス)に対して行う。制御したいメソッドに対してorg.springframework.security.access.prepost.PreAuthorizeアノテーションを設定すればよい。説明(1)<sec:global-method-security>要素のpre-post-annotations属性をenabledに指定する。デフォルトはdisabledである。説明(1)アクセス制御式を記述する。メソッドを実行する前に式が評価され、真であれば、メソッドが実行される。偽であれば、org.springframework.security.access.AccessDeniedExceptionがスローされる。(SpEL)で記述された式である。Tip上記の設定ではorg.springframework.security.access.prepost.PreAuthorize以外にも、以下のアノテーションを使用できる。マニュアルを参照されたい。@RolesAllowedではSpELによる記述ができない。@PreAuthorizeであればSpELを用いて、spring-security.xmlの設定と同じ記法で認可制御Noteリクエストパスに対する認可制御はControllerのメソッドにアノテーションをつけるのではなく、spring-security.xmlに設定を行うことを推奨する。ServiceがWeb経由でしか実行されず、リクエストパスのすべてのパターンが認可制御されているのであればServiceの認可制御は行わなくても良い。Serviceがどこから実行されるか分からず、認可制御が必要な場合にアノテーションを使用するとよい。ロール階層機能¶ロールに階層関係を設定することができる。上位に設定したロールは、下位ロールに認可されたすべてのアクセスが可能となる。ロールの関係が複雑な場合は、階層機能を検討されたい。ROLE_ADMINを上位ロール、ROLE_USERを下位ロールとして階層関係を設定する例で説明する。「ROLE_ADMIN」のロールを持つユーザも、「/user/*」のURLにアクセスできる。使用方法について、以降で説明する。共通で必要な設定について述べる。クラスのBean定義を行う。(2)hierarchyプロパティに階層関係を定義する。[下位ロール]例では、STAFFはUSERに認可されたすべてのリソースに、アクセスできる。ADMINはUSER、STAFFに認可されたすべてのリソースに、アクセスできる。アクセス認可(リクエストURL)、アクセス認可(JSP)での使用方法¶リクエストURL、JSPに対するロール階層の設定について述べる。説明(1)クラスにorg.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandlerを指定する。IDをプロパティに設定する。アクセス認可(Method)での使用方法¶Serviceのメソッドにアノテーションをつけて認可制御を行う場合のロール階層設定について説明する。説明(1)クラスにorg.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandlerを指定する。IDをプロパティに設定する。