DIGEST認証

広告

次はDIGEST認証について確認します。BASIC認証の場合、認証ダイアログが表示されてユーザー名とパスワードを入力するとプレインテキストでサーバに送られてしまいますのでもし通信内容が盗聴されるとユーザー名とパスワードが分かってしまいます。

DIGEST認証を行うと、入力されたパスワードがサーバに送られる時にダイジェストされたパスワードが送信されます。そして保存されているパスワードに対しても同じようにダイジェストが行われ比較されます。このようにネットワークに生のパスワードが流れないようにする事ができます。

※UserDatabaseRealmレルムやJDBCRealmレルムの属性に「digest」属性がありますが、DIGEST認証とは別のものです。この属性はパスワードなどをプレインテキストで保存しないための設定で「MD5」などを設定するとパスワードをテキストではなくMD5ダイジェストされたパスワードで保存する必要があります。DIGEST認証はプレインテキストで保存されたパスワードを自動でダイジェストして比較します。

web.xmlの設定

DIGEST認証を行う場合には認証方法の設定で<login-config>要素に含まれる<auth-method>要素に「DIGEST」を指定します。

<login-config>
  <auth-method>DIGEST</auth-method>
  <realm-name>レルム名</realm-name>
</login-config>

その他の設定についてはBASIC認証の場合と同じです。詳しくは『BASIC認証(web.xmlの編集)』を参照して下さい。

実際の設定例

では実際に試してみます。DIGEST認証の場合でもレルムはUserDatabaseRealmレルムとJDBCRealmレルムのどちらでも利用できます。今回はJDBCRealmレルムを使ってみます。

<Realm  className="org.apache.catalina.realm.JDBCRealm"
       driverName="com.mysql.jdbc.Driver"
    connectionURL="jdbc:mysql://localhost/auth"
   connectionName="authtest" connectionPassword="authtest"
        userTable="user_table" userNameCol="user" userCredCol="pass"
    userRoleTable="role_table" roleNameCol="role" />

MySQLの設定についてはBASIC認証の時と同じ設定を使います。詳しくは『BASIC認証(JDBCRealmレルム)』を参照して下さい。

次にweb.xmlファイルを次の条件で作成します。

リソース名:User Digest Auth
対象サーブレット:このアプリケーションに含まれる全てのサーブレット
対象のHTTPメソッド:全て
許可するロール名:sales
認証方式:DIGEST認証
レルム名:User Digest Auth

作成したweb.xmlファイルは次の通りです。

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  version="2.4">

  <servlet>
    <servlet-name>AuthTest1</servlet-name>
    <servlet-class>AuthTest1</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>AuthTest1</servlet-name>
    <url-pattern>/AuthTest1</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>AuthTest2</servlet-name>
    <servlet-class>AuthTest2</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>AuthTest2</servlet-name>
    <url-pattern>/AuthTest2</url-pattern>
  </servlet-mapping>

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>User Digest Auth</web-resource-name>
      <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>sales</role-name>
    </auth-constraint>
  </security-constraint>

  <login-config>
    <auth-method>DIGEST</auth-method>
    <realm-name>User Digest Auth</realm-name>
  </login-config>

  <security-role>
    <role-name>sales</role-name>
  </security-role>
</web-app>

それでは一度サーブレットを再起動してから、ブラウザで「http://localhost:8080/auth/AuthTest1」へアクセスして下さい。

DIGEST認証

上記のようにユーザー名とパスワードを入力するダイアログが表示されます。データベースに登録したユーザー名「itou」パスワード「itou」を入力します。

DIGEST認証

「itou」はユーザー認証が通り、所属するロールがアクセス許可に設定してるため、ページを見ることができます。

DIGEST認証

このように見た目上はBASIC認証と変わりがありません。現在ではほとんどのブラウザでDIGEST認証をサポートしていますのでBASIC認証ではなくDIGEST認証を使うようにした方がいいと思います。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。