アプリケーション認証の設定

認証では、アプリケーション開発者が Web アプリケーションに対して定義したロールをアプリケーションを実行するサーバーで適用する必要があります。このセクションでは、アプリケーションの開発時にロールとその他の認証情報をアプリケーションに設定する方法について説明します。

この情報をアプリケーション サーバーでどのように解釈して適用するかを設定する方法については、"サーバー認証メカニズムの制御"を参照してください。

アプリケーションの開発と公開の一環として、次の手順を実行してアプリケーションの認証を設定する必要があります。

  1. アプリケーションにアクセス ロールを割り当てる。
  2. アプリケーション サーバーがユーザを認証する方法を指定する。

アプリケーション認証を制御する情報は、アプリケーションの公開記述子である web.xml ファイルに含まれています。この情報を設定するには、web.xml を編集する必要があります。

Web アプリケーションへの認証ロールの割り当て

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> 要素を使用して次の情報を定義しています。

アプリケーションにアクセスできるロールの一覧を拡張できます。次の例では、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 では、web.xml 内で認証要素 user-data-constraintsecurity-role、および res-auth の使用をサポートしていません。


サーブレットからのロール情報へのアクセス

サーブレット内から、サーブレットにアクセスするクライアントのロール名とユーザ名にアクセスできます。これにより、ユーザのロールまたはユーザ名に基づいてサーブレットの条件付きで実行できます。たとえば、ユーザが customer のロールに含まれている場合はサーブレットはある処理を実行し、manager のロールに含まれている場合は別の処理を実行します。

サーブレット内では、Java サーブレットの開発時はサーブレットの HttpServletRequest オブジェクトを使用し、JSP ページの作成時は request オブジェクトを使用して、サーブレットを要求したユーザの情報を取得します。これらのメソッドを次に示します。

次の例では、ユーザが 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 通りの認証メソッドを設定できます。これらのメソッドによって、アプリケーション サーバーがユーザにログイン情報を要求する方法が決まります。


メモ

Java サーブレット API では、ユーザ認証を行う 4 つのメソッドを定義しています。 今回の JRun リリースでは、BASICFORM の 2 つだけがサポートされています。


BASIC 認証

BASIC 認証は HTTP 要求/応答メカニズムを使用して現在のユーザを認証します。このタイプの認証は、次のような一連のイベントによって行われます。

  1. ログインしていないユーザが Web アプリケーションへのアクセスを試みます。
  2. JRun がユーザのブラウザに HTTP エラー 401 (非認証アクセス) を返します。
  3. ブラウザには、ユーザ名とパスワードの入力を要求するプロンプトが表示されます。ブラウザに表示されるログイン プロンプトは次のとおりです。

  • ブラウザから JRun サーバーにログイン情報が返され、認証が行われます。

    ユーザ名とパスワードが有効であれば、サーバーは、ユーザがアプリケーションに アクセス権があることを認証します。ユーザ名とパスワードが有効な場合は、要求 されたページが表示され、それ以外の場合は、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 認証

    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> 
    

    使用するフォームには次の設定が含まれている必要があります。

    ユーザ名とパスワードが有効であれば、JRun は、ユーザがアプリケーションにアクセス権があることを認証します。ユーザ名とパスワードが有効な場合は、要求されたページが表示され、それ以外の場合は、JRun からユーザに HTTP 403 エラーが返されます。ユーザ名またはパスワードが無効な場合、<form-error-page> タグで指定されているページがユーザに転送されます。