WebLogic Server セキュリティ システムでは、Java EE セキュリティがサポートおよび拡張され、さまざまなセキュリティ データベースまたはセキュリティ ポリシーと統合するようカスタマイズできるセキュリティ プロバイダが豊富に用意されています。
Spring Security Web サイト (http://www.acegisecurity.org/
) の説明に従って、Acegi Security は Spring Security で、Spring ポートフォリオの正式なセキュリティ プロジェクトです。Spring セキュリティ (acegi) は、Spring アプリケーションにセキュリティを追加すると同時に、豊富なセキュリティ プロバイダを提供します。
問題は、これら 2 つのセキュリティ フレームワークをどうやって統合するかです。
J2EE と Spring アプリケーションを統合すると、両方のセキュリティ フレームワークを使用した認証は必要なくなり、WLS セキュリティと Spring セキュリティが連携します。WLS セキュリティが、セキュリティ レルムのデフォルトの認証プロバイダで認証を処理し、マッパー クラスを使用して WLS プリンシパルを Spring GrantedAuthority プリンシパルに変換します。ユーザは WLS セキュリティによって認証されると、Spring セキュリティに対して認証されます。したがって、アプリケーション内のオブジェクトを保護する方法を決定できます。一般的なのは、Java EE リソースを Weblogic セキュリティで保護し、Spring リソースを Spring セキュリティで保護する方法です。
Spring Security のリファレンスでも説明されているように、コンテナ アダプタを使用することで、エンド ユーザ アプリケーションをホストするコンテナ (この場合は WebLogic Server) に直接 Acegi Security を統合できます。
コンテナと Acegi Security は、アダプタを介して統合されます。アダプタは、コンテナと互換性のあるユーザ認証プロバイダを提供し、コンテナと互換性のあるユーザ オブジェクトを返す必要があります。
applicationContext-acegi-security.xml
は Spring セキュリティのコンフィグレーション ファイルです。Weblogic Server では、applicationContext-acegi-security.xml
内のフィールドのリストに、WeblogicAuthenticationFilter
が追加されています。このフィルタは、マッパーに基づいて WebLogic プリンシパルを Spring GrantedAuthority サブジェクトに変換するために使用します。マッパーは、WeblogicAuthenticationFilter
のプロパティとしてコンフィグレーションするもので、作成時に注入されます。
次に、マッパー クラスのサンプルを示します。
public class MyAuthorityGranter implements AuthorityGranter { public Set grant(Principal principal) { Set rtnSet = new HashSet(); if (principal.getName().equals("fred@oracle.com")) { rtnSet.add("ROLE_SUPERVISOR"); rtnSet.add("IS_AUTHENTICATED_ANONYMOUSLY"); } return rtnSet; } }
この例では、WebLogic domain であるユーザ fred@oracle.com
は、ROLE_SUPERVISOR
および IS_AUTHENTICATED_ANONYMOUSLY
にマップされます。
applicationContext-acegi-security.xml
ファイルをプラグインするには、web.xml
に次のコードを追加します。
<filter>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetClass</param-name>
<param-value>org.acegisecurity.util.FilterChainProxy</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<url-pattern>/main/secure/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-acegi-security.xml
</param-value>
</context-param>