1) はじめに
ログイン機能(前編)では、ユーザ情報の登録の仕方について
説明してきました。
WeberCreatorのユーザ登録機能をそのまま実行すると、パスワードは平文のままDBに登録されて
しまい、セキュリティ上好ましくありません。
ここでは、ユーザ登録機能にパスワードの暗号化処理を追加する手順について解説したいと 思います。
2) アクションクラスの修正
まずはアクションクラスから修正してきます。
修正の対象となるクラスは以下の3クラスになります。
修正対象クラス一覧
(1) ユーザ登録アクション(ユーザ更新アクション)の修正
public class UserRegistAction extends UserBaseAction {
/**
* 登録処理を行います
* @param bucket ActionBucketインスタンス
* @return 実行結果を返します(遷移先のファイル形式はモジュール名_実行結果.拡張子)
*/
public String doExecute(ActionBucket bucket) throws Exception{
User bean = (User)bucket.getForm();
UserDao dao = new UserDao();
//パスワードを暗号化します
String pwd = AngouUtil.encryptStr(bean.getName(), bean.getPassword());
bean.setPassword(pwd);
dao.save(bean); //更新処理の場合はdao.update(bean);
・・・(以下省略)
}
赤字で記載している箇所が修正箇所です。
AngouUtilクラスのencryptStrメソッドを使ってパスワードを暗号化しています。
encryptメソッドを実行すると暗号化アルゴリズム「Blowfish」によるパスワードの暗号化が
行われます。
第1引数にユーザ名を、第2引数にはパスワードを指定します。
encryptメソッドの戻り値が暗号化されたパスワードになります。
ユーザ登録アクションの修正が終わったら、ユーザ更新アクションも同様に、 暗号化処理を追加しましょう。
(2) ユーザ更新画面表示アクションの修正
ユーザ更新画面を表示する際、暗号化されたパスワードを復元します。
public class UserDisplayUpdateAction extends UserBaseAction {
/**
* 更新画面表示処理を行います
* @param bucket ActionBucketインスタンス
* @return 実行結果を返します(遷移先のファイル形式はモジュール名_実行結果.拡張子)
*/
public String doExecute(ActionBucket bucket) throws Exception{
UserDao dao = new UserDao();
//フォームには主キー項目がセットされているものとします
User form = (User)bucket.getForm();
User bean = dao.getUser(form);
//パスワードを復号化します
String pwd = AngouUtil.decryptStr(bean.getName(), bean.getPassword());
bean.setPassword(pwd);
bucket.setAttribute("user", bean);
・・・(以下省略)
}
赤字で記載している箇所が修正箇所です。
AngouUtilクラスのdecryptStrメソッドを使ってパスワードを復号化しています。
第1引数にユーザ名を、第2引数にはパスワードを指定します。
decryptStrメソッドの戻り値が復号化されたパスワードになります。
3) 動作確認1
アクションクラスの修正が終わったら、実際に動作を確認してみましょう。
まずはユーザ登録画面から以下のユーザを登録してみます。
ユーザ一覧画面で登録されたユーザのパスワードが暗号化されていることを確認してください。
次にユーザ一覧画面から先ほど作成したユーザのパスワードを変更してみましょう。
ユーザ一覧画面のtestユーザより"更新"ボタンを押下してみてください。
パスワードが複合化されて表示されていることが確認できます。
又、testユーザでログインできるかテストしてみてください。
4) HTMLの修正
パスワードの暗号化、複合化はアクションクラスを修正するだけで実現できますが、
ユーザ一覧画面や登録・更新画面のパスワードが画面に表示されてしまうのは
あまり好ましくありません。
ここでは、パスワードの入力項目をパスワードフィールドに変更してみたいと思います。
修正の対象となるHTMLは以下の3ファイルになります。
修正対象クラス一覧
(1) ユーザ登録画面(ユーザ更新画面)の修正
<p>パスワード(password)<input type="password" name="password" value="${user.password}"/></p>
(2) ユーザ一覧画面の修正
<table border="1" cellspacing="1" cellpadding="1" width="100%">
<tr>
<td>ID</td>
<td>ユーザ名</td>
<td>パスワード</td>
<td>権限名</td>
<td>編集</td>
<td>削除</td>
</tr>
<span w_kind="iterate" w_id="one_message" w_name="user_list">
<tr>
<td>${one_message.id}</td>
<td>${one_message.name}</td>
<td>*****</td>
<td>${one_message.role.name}</td>
<td><div onclick="window.location.assign('display_update.wb?
submit_update=true&id=${one_message.id}');"><u>
編集</u></div></td>
<td><div onclick="if( confirm('削除しますか?') )
window.location.assign('delete.wb?id=${one_message.id}');"><u>
削除</u></div></td>
</tr>
</span>
</table>
5) 動作確認2
HTMLの修正が終わったら、再度コンパイルし、動作を確認してみてください。
ユーザ一覧画面のパスワードフィールドが"*****”で表示されています。
パスワードの入力フィールドが”*****”で表示されています。