ヘッダーをスキップ

Oracle Containers for J2EE セキュリティ・ガイド
10g(10.1.3.4.0)

B50832-01
目次
目次
索引
索引

戻る 次へ

B OracleAS JAAS Providerのサンプル

この付録では、1つのサーブレットについていくつかのバージョンのサンプルを示します。最初に標準のJ2EEセキュリティAPIを使用したもの、次にユーザーにパーミッションを付与してポリシーを管理するコードを追加したもの、最後にユーザーのパーミッションをチェックするコード(JAASモードおよびJAAS認可)を追加したものを示します。

サンプル・サーブレットのセキュリティ構成

この付録に示す各バージョンのサンプル・サーブレットは、ファイルベース・プロバイダを使用し、次の構成に基づいています。

これらの構成を、この後の各項で示します。

system-jazn-data.xmlの構成

system-jazn-data.xmlファイルでは、jazn.comレルムに、developerユーザーおよびこのユーザーが属するdevelopersロールが定義されます。

ファイルベース・プロバイダに対してユーザーおよびロールを定義する場合、Application Server Controlを使用する方法をお薦めします(「Application Server Controlでのファイルベース・プロバイダの構成」を参照)。OracleAS JAAS Provider Admintoolも使用できます。

<jazn-data>
   ...
   <jazn-realm>
      <realm>
         <name>jazn.com</name>
         <users>
            ...
            <user>
               <name>developer</name>
               <display-name>developer</display-name>
               <credentials>{903}CafGQDjOlPMyMiwJEwUfyjhGLAbQkzhR</credentials>
            </user>
            ...
         </users>
 
         <roles>
            ...
            <role>
               <name>developers</name>
               <display-name>Developer Role</display-name>
               <members>
                  <member>
                     <type>user</type>
                     <name>developer</name>
                  </member>
               </members>
            </role>
            ...
         </roles>
      </realm>
   </jazn-realm>
   ...
</jazn-data>

web.xmlの構成

web.xmlファイルでは、セキュリティ制約を設定し、ロールsr_developersを定義します。認証方式に関する設定もあります。(web.xmlの認証方式はorion-application.xml<jazn-web-app>要素の設定で上書きできます。)

<web-app>
   ...
   <security-role>
        <role-name>sr_developers</role-name>
   </security-role>
   ...
   <security-constraint>
      <web-resource-collection>
         <web-resource-name>CallerInfoA</web-resource-name>
         <url-pattern>/callerInfoA</url-pattern>
      </web-resource-collection>
      <!-- authorization -->
      <auth-constraint>
         <role-name>sr_developers</role-name>
      </auth-constraint>
   </security-constraint>
   ...
   <!-- authentication -->
   <login-config>
      <auth-method>BASIC</auth-method>
   </login-config>
   ...
</web-app>

orion-application.xmlの構成

orion-application.xmlファイルでは、ファイルベース・プロバイダを指定し、セキュリティ・ロールsr_developersを、アイデンティティ・ストア(この例ではsystem-jazn-data.xml)に定義されているロールdevelopersにマップします。

Application Server Controlを使用して、セキュリティ・プロバイダおよびセキュリティ・ロール・マッピングを指定します(「セキュリティ・プロバイダの指定」および「セキュリティ・ロールのマッピング」を参照)。

<orion-application>
   ...
   <security-role-mapping name="sr_developers">
      <group name="developers" />
   </security-role-mapping>
   ... 
   <!-- use JAZN-XML by default -->
   <jazn provider="XML" />
   ...
</orion-application>

サンプル・サーブレット: J2EEセキュリティAPIの起動

この最初のバージョンのサーブレットでは、ユーザーの取得、ユーザーがロールに属しているかどうかの判別およびユーザー・プリンシパルの取得に、標準のJ2EEセキュリティAPIが使用されます。

import java.io.IOException;
import java.util.Date;
import java.util.Properties;
import javax.naming.*;
import javax.servlet.*;
import javax.servlet.http.*;


public class CallerInfo extends HttpServlet {
 
    public CallerInfo() {
        super();
    }
 
    public void init(ServletConfig config)
            throws ServletException {
        super.init(config);
    }
 
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletOutputStream out = response.getOutputStream();
 
        response.setContentType("text/html");
        out.println("<HTML><BODY bgcolor=\"#FFFFFF\">");
        out.println("Time stamp: " + new Date().toString());
        out.println
           ("request.getRemoteUser = " + request.getRemoteUser() + "<br>");
        out.println("request.isUserInRole('ar_developers') = " +
                     request.isUserInRole("sr_developers") + "<br>");
        out.println
            ("request.getUserPrincipal = " + request.getUserPrincipal() + "<br>");
        out.println("</BODY>");
        out.println("</HTML>");
    }

サンプル・サーブレット: パーミッションの付与

このバージョンのサーブレットでは、ユーザーにパーミッションを付与するコードが追加されています。パーミッションの付与には、OracleAS JAAS Provider Admintoolを使用することもできます(「パーミッションの付与と取消し」を参照)。

import java.io.*;
import java.util.Date;
import java.util.Properties;
import javax.naming.*;
import javax.servlet.*;
import javax.servlet.http.*;
import oracle.security.jazn.*;
import oracle.security.jazn.realm.*;
import oracle.security.jazn.oc4j.*;
import oracle.security.jazn.spi.Grantee;
import oracle.security.jazn.policy.*;
import javax.security.auth.*;
import java.security.*;
 
public class CallerInfo extends HttpServlet {
 
    public CallerInfo() {
        super();
    }
 
    public void init(ServletConfig config)
            throws ServletException {
        super.init(config);
    }
 
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletOutputStream out = response.getOutputStream();
        response.setContentType("text/html");
        out.println("<HTML><BODY bgcolor=\"#FFFFFF\">");
        out.println("Time stamp: " + new Date().toString());
        out.println
            ("request.getRemoteUser = " + request.getRemoteUser() + "<br>");
        out.println("request.isUserInRole('ar_developers') = " +
                     request.isUserInRole("ar_developers") + "<br>");
        out.println
            ("request.getUserPrincipal = " + request.getUserPrincipal() + "<br>");
 
   //Grant Permissions to a user developer
 
   //get JAZNConfiguration related info
   JAZNConfig jc = JAZNConfig.getJAZNConfig();
 
   //create a Grantee for "developer"
   RealmManager realmmgr = jc.getRealmManager();
   Realm realm = realmMgr.getRealm("jazn.com");
   UserManager userMgr = realm.getUserManager();
   final RealmUser user = userMgr.getUser("developer");
 
   //grant scott file permission
   JAZNPolicy policy = jc.getPolicy();
   if ( policy != null) {
      Grantee gtee = new Grantee( (Principal) user);
      java.io.FilePermission fileperm = new java.io.FilePermission
                                        ("foo.txt","read");
      policy.grant( gtee, fileperm);
   }
 
out.println("</BODY>");
   out.println("</HTML>");
}

サンプル・サーブレット: パーミッションのチェック

このバージョンのサーブレットでは、パーミッションをチェックするためのJAASモードおよびJAAS認可の構成およびコードが追加されています。

JAASモードでは、J2EEアプリケーションをSubject.doAs()ブロックで実行するのかSubject.doAsPrivileged()ブロックで実行するのかを制御します。このモードを設定すると、認証サブジェクトが、該当するアクセス制御コンテキストと関連付けられます。設定後、標準のJAASおよびJ2SE APIを使用して認可チェックをアプリケーションに組み込むことができます。

関連項目

 

orion-application.xmlのJAASモード構成

この例では、前に示したorion-application.xml構成が拡張され、JAASモードがdoasprivilegedに設定されています。この設定を使用して、OC4JはSubject.doAsPrivileged()ブロック内でサーブレットを実行します。

<orion-application>
   ...
   <security-role-mapping name="sr_developers">
      <group name="developers" />
   </security-role-mapping>
   ... 
   <!-- use JAZN-XML by default -->
   <jazn provider="XML" jaas-mode="doasprivileged" />
   ...
</orion-application>

認可のサーブレット・コード

次に示すサーブレット・コードでは、JAASポリシーを使用して、ユーザーにfoo.txtの読取り権限があるかどうかをチェックしています。前述の構成のために、doasprivilegedモードが使用されます。

この例では、比較のため、AccessControllerを使用してパーミッションをチェックする等価のコードも示しています。doAsPrivileged()ブロック内のコードは、JAASポリシー・コードのdoasprivileged構成と等価です。

import java.io.*;
import java.util.Date;
import java.util.Properties;
import javax.naming.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
import oracle.security.jazn.*;
import oracle.security.jazn.realm.*;
import oracle.security.jazn.oc4j.*;
import oracle.security.jazn.spi.Grantee;
import oracle.security.jazn.policy.*;
 
import javax.security.auth.*;
import java.security.*;
 
public class CallerInfo extends HttpServlet {
 
    public CallerInfo() {
        super();
    }
 
    public void init(ServletConfig config)
            throws ServletException {
        super.init(config);
    }
 
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
       final ServletOutputStream out = response.getOutputStream();
 
       response.setContentType("text/html");
       out.println("<HTML><BODY bgcolor=\"#FFFFFF\">");
       out.println("Time stamp: " + new Date().toString());
       out.println
           ("request.getRemoteUser = " + request.getRemoteUser() + "<br>");
       out.println("request.isUserInRole('ar_developers') = " +
                    request.isUserInRole("ar_developers") + "<br>");
       out.println
           ("request.getUserPrincipal = " + request.getUserPrincipal() + "<br>");
 
       //create Permission
       FilePermission perm = new FilePermission("/home/developer/foo.txt","read");
 
       // CHECK PERMISSION VIA JAAS POLICY
       //get current AccessControlContext
       AccessControlContext acc = AccessController.getContext();
       javax.security.auth.Policy currPolicy =
                      javax.security.auth.Policy.getPolicy();
       // Query policy now
       out.println("Policy permissions for this subject are " +
                   currPolicy.getPermissions(Subject.getSubject(acc),null));
       //Check Permissions
       out.println("Policy.impiles permission: "+ perm +" ? " +
           currPolicy.getPermissions(Subject.getSubject(acc),null).implies(perm));
 
       // CHECK USER'S PERMISSION VIA ACCESS CONTROLLER
       Subject.doAsPrivileged(s, new PrivilegedAction() {
            public Object run() {
                try {
                    AccessController.checkPermission(perm);
                    out.println("<br>");
                    out.println
                      ("AccessController checkPermission passed for permission: "
                       + perm);
                    out.println("<br>");
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }, null);

      out.println("</BODY>");
      out.println("</HTML>");
   }
}

戻る 次へ
Oracle
Copyright © 2003, 2008 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引