Oracle Containers for J2EE セキュリティ・ガイド 10g(10.1.3.1.0) B31857-01 |
|
この付録では、1つのサーブレットについていくつかのバージョンのサンプルを示します。最初に標準のJ2EEセキュリティAPIを使用したもの、次にユーザーにパーミッションを付与してポリシーを管理するコードを追加したもの、最後にユーザーのパーミッションをチェックするコード(JAASモードおよびJAAS認可)を追加したものを示します。
この付録に示す各バージョンのサンプル・サーブレットは、ファイルベース・プロバイダを使用し、次の構成に基づいています。
system-jazn-data.xml
: ロールdevelopers
に属しているユーザーdeveloper
web.xml
: サーブレットのロールsr_developers
およびセキュリティ制約
orion-application.xml
: developers
とsr_developers
間のロール・マッピング
これらの構成を、この後の各項で示します。
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
ファイルでは、セキュリティ制約を設定し、ロール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
ファイルでは、ファイルベース・プロバイダを指定し、セキュリティ・ロールsr_developers
を、IDストア(この例では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が使用されます。
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モードが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>"); } }
|
Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|