<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Migration  |  takeHo（たけほ）のへなちょこ台帳</title>
	<atom:link href="https://blog.takeho.com/tag/migration/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.takeho.com</link>
	<description>いわゆる自由帳ってところです。</description>
	<lastBuildDate>Tue, 09 Dec 2025 01:19:34 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6</generator>

<image>
	<url>https://blog.takeho.com/wp-content/uploads/2024/08/icon-150x150.png</url>
	<title>Migration  |  takeHo（たけほ）のへなちょこ台帳</title>
	<link>https://blog.takeho.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>ユーザ認証の実装方法</title>
		<link>https://blog.takeho.com/smugmkxlxsf8by6zb8ifvem6rupeawe3/</link>
					<comments>https://blog.takeho.com/smugmkxlxsf8by6zb8ifvem6rupeawe3/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Sat, 03 Aug 2024 07:06:00 +0000</pubDate>
				<category><![CDATA[Yii2]]></category>
		<category><![CDATA[CRUD]]></category>
		<category><![CDATA[Gii]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[認証]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=143</guid>

					<description><![CDATA[Yii2のベーシックパックには標準でユーザ認証のサンプルがありますが、データベース管理ではなく簡易的な固定オブジェクトの為、商用利用に向かない仕様です。 ここではユーザ認証のサンプルを固定オブジェクトからデータベース管理 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Yii2のベーシックパックには標準でユーザ認証のサンプルがありますが、データベース管理ではなく簡易的な固定オブジェクトの為、商用利用に向かない仕様です。</p>



<p>ここではユーザ認証のサンプルを固定オブジェクトからデータベース管理に切り替える方法を説明します。</p>



<p>尚、Yii2のインストールがされていない場合は以下を参考してください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-takeho wp-block-embed-takeho"><div class="wp-block-embed__wrapper">

<a href="https://blog.takeho.com/how-to-install-and-initialize-yii2/" title="Yii2のインストール・初期設定方法" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://blog.takeho.com/wp-content/uploads/2024/07/20240718.webp" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Yii2のインストール・初期設定方法</div><div class="blogcard-snippet external-blogcard-snippet">日本国では人気の無いフレームワークYii2 充実したライブラリと機能性の高さの割に大規模なウェブアプリケーションだけでなく小規模なウェブアプリケーションでも開発しやすいようディレクトリの構成変更が簡単にできる便利なフレームワークです。 この</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://blog.takeho.com/y96x9r38o0zq6jvjcvs3znskqu59mymz/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">blog.takeho.com</div></div></div></div></a>
</div></figure>



<h2 class="wp-block-heading">データベーステーブルとモデルの作成</h2>



<p>マイグレーションを使用してユーザ管理用データベーステーブルを用意します。</p>



<h3 class="wp-block-heading">データベーステーブルの作成</h3>



<h4 class="wp-block-heading">マイグレーションファイルの作成</h4>



<p>次のコマンドを実行してマイグレーションファイルを作成します。</p>



<pre class="wp-block-code"><code># php yii migrate/create create_user_table --fields="username:string(32):notNull:unique,password:string(64):notNull,access_token:string(32),auth_key:string(32)"
Yii Migration Tool (based on Yii v2.0.51)

Create new migration '/var/www/html/yii2.takeho.com/migrations/m240806_073739_create_user_table.php'? (yes|no) &#91;no]:yes
New migration created successfully.
#</code></pre>



<p>コマンド実行後、migrationsのディレクトリの作成及びその中に以下のファイルが生成されます。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>生成ファイル名</td><td>m000000_000000_create_user_table.php</td></tr></tbody></table></figure>



<pre class="wp-block-code"><code>&lt;?php

use yii\db\Migration;

/**
 * Handles the creation of table `{{%user}}`.
 */
class m000000_000000_create_user_table extends Migration
{
    /**
     * {@inheritdoc}
     */
    public function safeUp()
    {
        $this-&gt;createTable('{{%user}}', &#91;
            'id' =&gt; $this-&gt;primaryKey(),
            'username' =&gt; $this-&gt;string(32)-&gt;notNull()-&gt;unique(),
            'password' =&gt; $this-&gt;string(64)-&gt;notNull(),
            'access_token' =&gt; $this-&gt;string(32),
            'api_key' =&gt; $this-&gt;string(32),
        ]);
    }

    /**
     * {@inheritdoc}
     */
    public function safeDown()
    {
        $this-&gt;dropTable('{{%user}}');
    }
}</code></pre>



<h4 class="wp-block-heading">マイグレーションの反映</h4>



<p>次の要領でコマンドを実行します。</p>



<pre class="wp-block-code"><code># php yii migrate
Yii Migration Tool (based on Yii v2.0.51)

Creating migration history table "migration"...Done.
Total 1 new migration to be applied:
        m240806_073739_create_user_table

Apply the above migration? (yes|no) &#91;no]:yes
*** applying m240806_073739_create_user_table
    &gt; create table {{%user}} ... done (time: 0.006s)
*** applied m240806_073739_create_user_table (time: 0.012s)


1 migration was applied.

Migrated up successfully.
#</code></pre>



<p>上記実行後、データベースにuserテーブルが作成されている事が確認できます。</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="878" height="264" src="https://blog.takeho.com/wp-content/uploads/2024/08/20240803_01_2.png" alt="" class="wp-image-135" srcset="https://blog.takeho.com/wp-content/uploads/2024/08/20240803_01_2.png 878w, https://blog.takeho.com/wp-content/uploads/2024/08/20240803_01_2-640x192.png 640w, https://blog.takeho.com/wp-content/uploads/2024/08/20240803_01_2-768x231.png 768w" sizes="(max-width: 878px) 100vw, 878px" /></figure>



<h3 class="wp-block-heading">モデルの作成</h3>



<p>モデルの作成にはYii2のGUI生成ツール<strong>Gii</strong>を仕様します。</p>



<h4 class="wp-block-heading">モデル生成ページへアクセス</h4>



<p>次のURLへアクセスします。</p>



<pre class="wp-block-code"><code>http:&#47;&#47;www.example.com/index.php?r=gii</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1092" height="781" src="https://blog.takeho.com/wp-content/uploads/2024/08/20240803_01.png" alt="" class="wp-image-142" srcset="https://blog.takeho.com/wp-content/uploads/2024/08/20240803_01.png 1092w, https://blog.takeho.com/wp-content/uploads/2024/08/20240803_01-640x458.png 640w, https://blog.takeho.com/wp-content/uploads/2024/08/20240803_01-768x549.png 768w" sizes="(max-width: 1092px) 100vw, 1092px" /></figure>



<p>Model Generatorの項目にある<strong>Start</strong>を押下します。</p>



<h4 class="wp-block-heading">パラメータ設定</h4>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1096" height="1256" src="https://blog.takeho.com/wp-content/uploads/2024/08/20240803_02.png" alt="" class="wp-image-136" srcset="https://blog.takeho.com/wp-content/uploads/2024/08/20240803_02.png 1096w, https://blog.takeho.com/wp-content/uploads/2024/08/20240803_02-558x640.png 558w, https://blog.takeho.com/wp-content/uploads/2024/08/20240803_02-768x880.png 768w" sizes="(max-width: 1096px) 100vw, 1096px" /></figure>



<p>上記を参考に以下の情報を入力・設定し、<strong>Preview</strong>を押下します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Use Table Prefix</td><td>－</td></tr><tr><td>Use Schema Name</td><td>チェック</td></tr><tr><td>Table Name</td><td>user</td></tr><tr><td>Standardize Capitals</td><td>－</td></tr><tr><td>Singularize</td><td>－</td></tr><tr><td>Model Class Name</td><td>User</td></tr><tr><td>Generate Relations From Current Schema</td><td>チェック</td></tr><tr><td>Use &#8216;::class&#8217;</td><td>チェック</td></tr><tr><td>Generate Labels From DB Comments</td><td>チェック</td></tr><tr><td>Generate ActiveQuery</td><td>－</td></tr><tr><td>Enable I18N</td><td>－</td></tr></tbody></table></figure>



<h4 class="wp-block-heading">確認画面（プレビュー）</h4>



<p><strong>Generate</strong>を押下します。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1201" height="596" src="https://blog.takeho.com/wp-content/uploads/2024/08/20240803_03.png" alt="" class="wp-image-137" srcset="https://blog.takeho.com/wp-content/uploads/2024/08/20240803_03.png 1201w, https://blog.takeho.com/wp-content/uploads/2024/08/20240803_03-640x318.png 640w, https://blog.takeho.com/wp-content/uploads/2024/08/20240803_03-768x381.png 768w" sizes="(max-width: 1201px) 100vw, 1201px" /></figure>



<h4 class="wp-block-heading">生成確認</h4>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1200" height="603" src="https://blog.takeho.com/wp-content/uploads/2024/08/20240803_04.png" alt="" class="wp-image-140" style="width:840px;height:auto" srcset="https://blog.takeho.com/wp-content/uploads/2024/08/20240803_04.png 1200w, https://blog.takeho.com/wp-content/uploads/2024/08/20240803_04-640x322.png 640w, https://blog.takeho.com/wp-content/uploads/2024/08/20240803_04-768x386.png 768w" sizes="(max-width: 1200px) 100vw, 1200px" /></figure>



<p>次のファイルが生成されているか確認します。</p>



<pre class="wp-block-code"><code>/models/User.php</code></pre>



<h2 class="wp-block-heading">CRUD（create、read、update、delete）機能の追加とデータの投入</h2>



<p>モデルと同じ要領でGiiで以下のパラメータを指定してCURDを生成します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Model Class</td><td>User</td></tr><tr><td>Search Model Class</td><td>app\models\UserSearch</td></tr><tr><td>Controller Class</td><td>app\controllers\UserController</td></tr><tr><td>View Path</td><td>@app\views\user</td></tr><tr><td>Enable I18N</td><td>－</td></tr><tr><td>Enable Pjax</td><td>チェック</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">動作確認</h3>



<p>次のURLへアクセスしてCRUDが機能するか確認します。</p>



<pre class="wp-block-code"><code>http:&#47;&#47;www.example.com?r=user/index</code></pre>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1217" height="518" src="https://blog.takeho.com/wp-content/uploads/2024/08/20240803_07.png" alt="" class="wp-image-155" style="width:840px;height:auto" srcset="https://blog.takeho.com/wp-content/uploads/2024/08/20240803_07.png 1217w, https://blog.takeho.com/wp-content/uploads/2024/08/20240803_07-640x272.png 640w, https://blog.takeho.com/wp-content/uploads/2024/08/20240803_07-768x327.png 768w" sizes="(max-width: 1217px) 100vw, 1217px" /></figure>



<h3 class="wp-block-heading">User登録フォームの改修</h3>



<p>前頁で作成したUserの<strong>CURD</strong>には次の問題があるので修正を行います。</p>



<ul class="wp-block-list">
<li>Auth Keyの入力は不要だか新規登録時に自動で値が設定される必要がある</li>



<li>Access Tokenの入力が不要</li>



<li>パスワードが平文保存されている</li>
</ul>



<h4 class="wp-block-heading">Auth Keyの値を自動設定する</h4>



<p>次のコードを参考にmodel/User.phpへbeforeSaveメソッドを追加します。</p>



<pre class="wp-block-code"><code>  public function beforeSave($insert)
  {
      if (parent::beforeSave($insert)) {
          if ($this-&gt;isNewRecord) {
              $this-&gt;auth_key = \Yii::$app-&gt;security-&gt;generateRandomString();
          }
          return true;
      }
      return false;
  }</code></pre>



<p>上記より保存する前に新しいレコードの追加（insert）が確認の上、ランダムな文字列をauth_keyへセットします。</p>



<h4 class="wp-block-heading">Auth KeyとAccess Token<strong>の</strong>入力を消す</h4>



<p><strong>Auth Key</strong>と<strong>Access Token</strong>は動的に生成する情報になり入力するべき項目ではありませんので、入力項目を消します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>ファイル名</td><td>/views/user/_form.php</td></tr></tbody></table></figure>



<p>次の項目を削除します。</p>



<pre class="wp-block-code"><code>    &lt;?= $form-&gt;field($model, 'access_token')-&gt;textInput(&#91;'maxlength' =&gt; true]) ?&gt;

    &lt;?= $form-&gt;field($model, 'auth_key')-&gt;textInput(&#91;'maxlength' =&gt; true]) ?&gt;</code></pre>



<h4 class="wp-block-heading">パスワードの保存をハッシュ値に変更</h4>



<p>次のコードを参考にmodel/User.phpのbeforeSaveメソッドを編集します。</p>



<pre class="wp-block-code"><code>    public function beforeSave($insert)
    {
        if (parent::beforeSave($insert)) {
            $this-&gt;password = Yii::$app-&gt;security-&gt;generatePasswordHash($this-&gt;password);
            if ($this-&gt;isNewRecord) {
                $this-&gt;auth_key = Yii::$app-&gt;security-&gt;generateRandomString();
            }
            return true;
        }
        return false;
    }</code></pre>



<p>上記のように<strong>$this-&gt;password</strong>の値をセキュリティクラスからハッシュ値を求めた値に設定します。</p>



<h2 class="wp-block-heading">認証インターフェイスの環境を整える</h2>



<p>認証インターフェイスの利用に必須となる次のメソッドをUserモデルに追加します。</p>



<pre class="wp-block-code"><code>
    public static function findIdentity($id)
    {
      return static::findOne($id);
    }

    public static function findIdentityByAccessToken($token, $type = null)
    {
      return static::findOne(&#91;'access_token' => $token]);
    }

    public static function findByUsername($username)
    {
      return static::findOne(&#91;'username' => $username]);
    }

    public function getId()
    {
      return $this->id;
    }

    public function getAuthKey()
    {
      return $this->auth_key;
    }

    public function validateAuthKey($authKey)
    {
      return $this->getAuthKey() === $authKey;
    }

    public function validatePassword($password)
    {
      return Yii::$app->getSecurity()->validatePassword($password, $this->password);
    }</code></pre>



<h2 class="wp-block-heading">アクセス確認</h2>



<p>次のURLへアクセスして認証確認を行います。</p>



<pre class="wp-block-code"><code>http:&#47;&#47;www.example.com/index.php?r=site/login</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1105" height="699" src="https://blog.takeho.com/wp-content/uploads/2024/08/20240803_09.png" alt="" class="wp-image-165" srcset="https://blog.takeho.com/wp-content/uploads/2024/08/20240803_09.png 1105w, https://blog.takeho.com/wp-content/uploads/2024/08/20240803_09-640x405.png 640w, https://blog.takeho.com/wp-content/uploads/2024/08/20240803_09-768x486.png 768w" sizes="(max-width: 1105px) 100vw, 1105px" /></figure>



<p>ログインに成功したらデバックツールバーの<strong>User</strong>を押下して認証されている情報を確認できます。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/smugmkxlxsf8by6zb8ifvem6rupeawe3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
