認証では、アプリケーション開発者が 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>
タグで指定されているページがユーザに転送されます。