ランダムパスワードを生成するCakePHPのコンポーネントを作ったよ

どうも。風邪っぴきiyamaです。 今回はCakePHPでパスワードを生成する独自コンポーネントを作ってみました。

会員サイトなんかを作ったとき、ランダムなパスワードを生成することとかありますよね。 パスワード生成自体はいろいろな方法があると思いますが、今回は練習もかねて独自コンポーネントにしてみます。

パスワード生成部分は以下のサイトのコードを拝借しました。

phpでランダムなパスワードを生成

環境

  • CakePHP 1.3

Component

※記号も含むタイプも追加してみた。

controller/component/random_password.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class RandomPasswordComponent extends Object {

    function createPassword($length = 8, $mode = 'alnum') {
        if ($length < 1 || $length > 256) {
            return false;
        }

        $smallAlphabet = 'abcdefghijklmnopqrstuvwxyz';
        $largeAlphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $numeric = '0123456789';
        $sign = '!#$%&*+@?';

        switch ($mode) {
            // 小文字英字
            case 'small':
                $chars = $smallAlphabet;
                break;
            // 大文字英字
            case 'large':
                $chars = $largeAlphabet;
                break;
            // 小文字英数字
            case 'smallalnum':
                $chars = $smallAlphabet . $numeric;
                break;
            // 大文字英数字
            case 'largealnum':
                $chars = $largeAlphabet . $numeric;
                break;
            // 数字
            case 'num':
                $chars = $numeric;
                break;
            // 大小文字英字
            case 'alphabet':
                $chars = $smallAlphabet . $largeAlphabet;
                break;
            // 大小文字英数字
            case 'alnum':
            default:
                $chars = $smallAlphabet . $largeAlphabet . $numeric;
                break;
            // 大小文字英数字 + 記号
            case 'alnumsign':
                $chars = $smallAlphabet . $largeAlphabet . $numeric . $sign;
                break;
        }

        $charsLength = strlen($chars);
        $password = '';
        for ($i = 0; $i &lt; $length; $i++) {
            $num = mt_rand(0, $charsLength - 1);
            $password .= $chars{$num};
        }

        return $password;
    }
}

Controller

使い方は、まずコンポーネントを宣言。 Authコンポーネントも使う場合は一緒に記述。

1
var $components = array('RandomPassword', 'Auth');

コンポーネントの呼び出し+ID/PWをUserTableに追加。

1
2
3
4
5
6
//Authコンポーネントの暗号化を使うため呼び出しておく
App::import('Component', 'Auth');
$name = "xxxx";
$pass = $this->RandomPassword->createPassword(8, 'alnum');
$this->User->create();
$this->User->save(array('id' => null, 'username' => $name, 'password' => AuthComponent::password($pass)));

以上です。 わざわざコンポーネントにしなくてもいいんだけど。。 でもコンポーネントって案外簡単にできるのね。

Comments