認証では、アプリケーション開発者が Web アプリケーションに対して定義したロールをアプリケーションを実行するサーバーで適用する必要があります。このセクションでは、アプリケーションの開発時にロールとその他の認証情報をアプリケーションに設定する方法について説明します。
この情報をアプリケーション サーバーでどのように解釈して適用するかを設定する方法については、"サーバー認証メカニズムの制御"を参照してください。
アプリケーションの開発と公開の一環として、次の手順を実行してアプリケーションの認証を設定する必要があります。
   アプリケーション認証を制御する情報は、アプリケーションの公開記述子である web.xml ファイルに含まれています。この情報を設定するには、web.xml を編集する必要があります。 
Web アプリケーションへのアクセスは、ユーザがアプリケーションまたはアプリケーション リソースにアクセスするときに必要なロールを設定することによって制御します。つまり、ユーザがアプリケーションにアクセスするには、アプリケーションにアクセスする権限を持つロールが割り当てられている必要があります。
   アクセス制限は、アプリケーション全体に割り当てたり、アプリケーション内部のリソースに割り当てることができます。アプリケーションへのアクセス権を持つロールを定義しているアプリケーションの web.xml ファイルの一部を次に示します。
<web-app>
  ...
  <security-constraint> 
    <web-resource-collection> 
      <web-resource-name>Store Application</web-resource-name> 
      <url-pattern>/store/*</url-pattern> 
      <http-method>GET</http-method> 
      <http-method>POST</http-method> 
      <description>Sales Info Resource</description> 
    </web-resource-collection> 
    <auth-constraint> 
      <role-name>manager</role-name> 
      <description>Managers only</description> 
    </auth-constraint> 
  </security-constraint> 
  ...
</web-app>
この例では、<security-constraint> 要素を使用して次の情報を定義しています。
この例では、URL に /store が含まれているすべてのアプリケーション リソース
へのアクセスを制御しています。アプリケーション全体を認証するには、URL 
パターンを * に設定します。
<url-pattern>*</url-pattern>
GET および POST であること。http-method 要素を省略すると、すべてのアクセス メソッドが認証されます。 
   アプリケーションにアクセスできるロールの一覧を拡張できます。次の例では、Web アプリケーションへのアクセス権を持つロールに developer のロールを追加します。
<auth-constraint>
<role-name>manager</role-name> <role-name>developer</role-name> <description>Managers and developers</description> </auth-constraint>
   アプリケーション内のすべてのリソースに認証を適用する代わりに、特定のアプリケーション リソースに認証ロールを割り当てることができます。次の例では、アプリケーションの servlet ディレクトリにあるサーブレットと、アプリケーションの pricing ディレクトリにあるリソースにのみ認証を割り当てています。
<web-app>
  ...
  <security-constraint> 
    <web-resource-collection> 
      <web-resource-name>Store Application</web-resource-name> 
      <url-pattern>/store/servlet/*</url-pattern> 
      <url-pattern>/store/pricing/*</url-pattern> 
      <http-method>GET</http-method> 
      <http-method>POST</http-method> 
      <description>Sales Info Resource</description> 
    </web-resource-collection> 
    <auth-constraint> 
      <role-name>manager</role-name> 
      <description>Managers only</description> 
    </auth-constraint> 
  </security-constraint> 
  ...
</web-app>
   <security-constraint> 要素には次の構文があります。
<security-constraint>
(web-resource-collection+, auth-constraint?, user-data-constraint?)> </security-constraint>
   この構文では、+ 記号は、1 つまたは複数の web-resource-collection 要素を定義できることを意味し、? は、auth-constraint および user-data-constraint 要素をオプションで指定できることを示します。 
<web-resource-collection> 要素には次の構文があります。
<web-resource-collection>
(web-resource-name, description?, url-pattern*, http-method*) </web-resource-collection>
   web-resource-name 要素は必ず指定します。また、description 要素を指定することもできます。* は、url-pattern および http-method 要素を 0 個以上指定できることを示します。
| メモ JRun では、 | 
サーブレット内から、サーブレットにアクセスするクライアントのロール名とユーザ名にアクセスできます。これにより、ユーザのロールまたはユーザ名に基づいてサーブレットの条件付きで実行できます。たとえば、ユーザが customer のロールに含まれている場合はサーブレットはある処理を実行し、manager のロールに含まれている場合は別の処理を実行します。
   サーブレット内では、Java サーブレットの開発時はサーブレットの HttpServletRequest オブジェクトを使用し、JSP ページの作成時は request オブジェクトを使用して、サーブレットを要求したユーザの情報を取得します。これらのメソッドを次に示します。
getRemoteUser  ユーザがログインしている場合は、要求を出したユーザのログイン名を、ログインしていない場合は、ヌルを返します。
isUserInRole  メソッドに渡されたロール名にユーザが含まれていれば、true を返します。 getUserPrincipal  ユーザがログインしている場合はユーザ名が含まれているjava.security.Principal オブジェクトを、ログインしていない場合はヌルを返します。
   次の例では、ユーザが Web アプリケーション内のサーブレット myServlet に対し、all または manager 認証ロールが必要であることを指定しています。
<web-app>
  ...
  <servlet>
    <servlet-name>
      myServlet
    </servlet-name>
    <servlet-class>
      myServlet
    </servlet-class>
    <security-role-ref>
      <role-name>
        all
      </role-name>
    </security-role-ref>
    <security-role-ref>
      <role-name>
        manager
      </role-name>
    </security-role-ref>
  </servlet>
  ...
</web-app>
| メモ この指定では、サーブレット自体の認証を制限しません。認証制限はアプリケーション レベルで指定します。この指定では、サーブレットに対して適用される認証制限を 認識することができます。 | 
サーブレット内部では、次の Java サーブレット の例に示すように、ユーザのロールを判別してサーブレットを条件付きで実行できます。
public void service(HttpServletRequest req, HttpServletResponse resp)
  throws IOException{ 
  ...
  if(req.isUserInRole("manager")) {
    // manager として処理します。
  }
  if(req.isUserInRole("all")) {
    // ほかのすべてのユーザとして処理します。
  }
JSP ページ内で使用する場合は、次の例を使用してページを条件付きで処理できます。
<%
  if(req.isUserInRole("manager")) {
    // manager として処理します。
  }
  if(req.isUserInRole("all")) {
    // ほかのすべてのユーザとして処理します。
  }
%>
   サーブレットのもう 1 つのオプションは、サーブレットの web.xml 定義で認証リンクを設定できることです。サーブレット開発者はロールを表す語句を使用でき、その語句をアプリケーション開発者が指定した実際のロール名にリンクさせることができます。アプリケーション開発者がアプリケーションに関連付けられているロールを変更した場合でも、JSP 開発者は web.xml ファイル内のロールのリンクを変更するだけで済みます。
   次の例は、ロールのリンクを使用したサーブレットの web.xml 定義を示します。
<web-app>
  ...
  <servlet>
    <servlet-name>
      myServlet
    </servlet-name>
    <servlet-class>
      myServlet
    </servlet-class>
    <security-role-ref>
      <role-name>
        MGR
      </role-name>
      <role-link>
        manager
      </role-link>
    </security-role-ref>
  </servlet>
   ...
</web-app>
   この例では、サーブレットは manager のロールを MGR としています。一方、<role-link> タグでは、Web アプリケーション レベルで設定されているサーブレットの MGR ロール指定と manager 指定間のリンクを定義しています。このリンクによって、サーブレットのロールの定義がアプリケーションの定義と関連付けられます。 
   supervisor のロール名を使用してマネージャのロールを認証するように後で変更された場合は、サーブレットの定義を次のように変更します。 
<role-name>
MGR </role-name> <role-link> supervisor </role-link>
   ロールのリンクによって、サーブレットは、<role-name> タグで定義されているロールに基づいて常に条件付きで処理されます。このとき、<role-link> タグを使用して Web アプリケーションの一部としてこのようなサーブレットを使用すると、サーブレットのロールの定義をアプリケーションの定義と関連付けることができます。ロールのリンク機能により、複数のアプリケーション間でサーブレットを移植できるようになります。 
アプリケーション サーバーでアプリケーションに対するユーザのアクセス権を認証するには、サーバーでユーザを識別できることが必要です。ユーザを識別すると、サーバーは、ユーザに割り当てられているロールを識別し、それによってユーザのアクセス権を識別できます。
ユーザが最初に Web アプリケーションにアクセスすると、アプリケーション サーバーはユーザ名とパスワードを使用してログインするようにユーザに要求します。このログイン情報から、サーバーはユーザのロールを判別できます。
   アプリケーションの web.xml ファイルでは、次の 2 通りの認証メソッドを設定できます。これらのメソッドによって、アプリケーション サーバーがユーザにログイン情報を要求する方法が決まります。
BASIC  HTTP 要求/応答メカニズムを使用してユーザをログインさせます。 
FORM  アプリケーション開発者がログイン フォームを表示します。 | メモ Java サーブレット API では、ユーザ認証を行う 4 つのメソッドを定義しています。
今回の JRun リリースでは、 | 
   BASIC 認証は HTTP 要求/応答メカニズムを使用して現在のユーザを認証します。このタイプの認証は、次のような一連のイベントによって行われます。
ユーザ名とパスワードが有効であれば、サーバーは、ユーザがアプリケーションに アクセス権があることを認証します。ユーザ名とパスワードが有効な場合は、要求 されたページが表示され、それ以外の場合は、JRun からユーザに HTTP 403 エラー が返されます。
ユーザが認証プロセスをキャンセルすると、サーバーから HTTP 401 エラー ページ が返されます。
"認証の例"の図でもこの手順を示しています。
   アプリケーションで BASIC 認証を使用するように指定するには、web.xml に次のコードを追加します。 
<web-app>
  ...
  <login-config> 
    <auth-method> 
      BASIC 
    </auth-method> 
    <realm-name> 
      Sales 
    </realm-name> 
  </login-config> 
  ...
</web-app>
   realm-name プロパティを省略すると、アプリケーションのホストであるサーバー名が領域名として使用されます。 
   FORM 認証により HTML フォームを使用してユーザ名とパスワードを取得できます。次の図は、FORM 認証の手順を示します。
   次の例に示すように、web.xml ファイルにはログイン フォームとエラー フォームの両方を指定できます。 
<web-app>
  ...
  <login-config> 
    <auth-method> 
      FORM 
    </auth-method> 
    <form-login-config> 
      <form-login-page> 
        /login.htm 
      </form-login-page> 
      <form-error-page> 
        /loginerror.htm 
      </form-error-page> 
    </form-login-config> 
  </login-config> 
  ...
</web-app>
   ユーザが Web アプリケーションを要求すると、JRun サーバーは <form-login-page> 要素によって指定されているページをユーザに転送します。次の HTML ページ login.htm は、このログイン ページの例です。
<html>
<head> <title>My Login Page</title> </head> <body> <center> <h2>You have requested a secured page.Please login.</h2> <form method="POST" action="j_security_check"> <table> <tr><td>User</td><td><input type=text name="j_username"></tr> <tr><td>Password</td><td><input type=password name="j_password"></tr> </table> <br><br> <input type=submit> </form> </center> </body> </html>
j_security_check のアクションを使用して渡す必要があります (POST のみ)。アプリケーションを実行するサーバーは、このアクションを認識してフォームを処理します。
j_username というフィールドに保存する必要があります。j_password というフィールドに保存する必要があります。
   ユーザ名とパスワードが有効であれば、JRun は、ユーザがアプリケーションにアクセス権があることを認証します。ユーザ名とパスワードが有効な場合は、要求されたページが表示され、それ以外の場合は、JRun からユーザに HTTP 403 エラーが返されます。ユーザ名またはパスワードが無効な場合、<form-error-page> タグで指定されているページがユーザに転送されます。