投稿者「後藤 祐一」のアーカイブ

後藤 祐一 について

フリーランスとしてWebプログラミングを行っています。 宜しくお願いします。

Laravel Authログイン暗号化 Hash::make

ユーザーに権限を持たせたり自分でログイン周りを実装する事になったので調べてみた。

環境
Laravel:5.5 LTS

パスワードの暗号化

Hash::make($data['password']);

データベースに登録する前に暗号化する。

ログイン時のチェック

if (Hash::check($request->pass, $result->pass)) {
    // ログイン成功の処理を書く
    return redirect()->action('Admin\MyController@index')->with('status', 'Login successful.');
} else {
    // バリデートにエラーメッセージを追加する
    return back()->withErrors('failed login attempt.');
}

Hash::makeで暗号化すると毎回違う値に暗号化されるので
Hash::checkにて暗号化されたパスワードとリクエストパスワードを比較する。

Laravel 親コントローラーやコントローラー外でのリダイレクト

ログイン周りの機能を自分で実装したときコントローラー外でリダイレクトする書き方が分からなかったので調べました。

環境
Laravel:5.5 LTS

app/Http/Controllers/Controller.php

use Illuminate\Support\Facades\Redirect;
Redirect::to('admin/login')->send();

このように書けばコントローラ外の独自クラスや親コントローラーでもリダイレクトさせられることができます。
公式ドキュメントに書いてない書き方ってどうやって調べているんだろう。

WordPress 引越し・移行したのでまとめ

※事前に必ずバックアップを取りましょう

環境
WordPress:5.0.3
PHP:7.1.3
OS:Win10 XAMPP
ツール:WinSCP,phpMyAdmin
DB:MySQL

ファイルのダウンロード

まずは現在WPが稼動しているサーバーから全ファイルをダウンロードします。
※特に注意点なし

データベースのエクスポート

WPが稼動しているデータベースからデータのエクスポート
公式ドキュメントより
「生成オプション」セクション
「DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT / TRIGGER コマンドを追加する」をチェックしてエクスポート

ファイルを移行先にアップロード

ファイルをアップロードしたら設定ファイルを編集して移行先のデータベース情報を設定してください。
wp-config.php

// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define('DB_NAME', 'database_name_here');

/** MySQL データベースのユーザー名 */
define('DB_USER', 'username_here');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'password_here');

/** MySQL のホスト名 */
define('DB_HOST', 'localhost');

/** データベースのテーブルを作成する際のデータベースの文字セット */
define('DB_CHARSET', 'utf8');

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define('DB_COLLATE', '');

データベースのインポート

厄介なのでSQLで一括で編集

UPDATE wp_options SET option_value="https://localhost/blog" WHERE option_name="siteurl";
UPDATE wp_options SET option_value="https://localhost/blog" WHERE option_name="home";
UPDATE wp_posts SET post_content=REPLACE(post_content, "https://office-goto.info", "https://localhost/blog");

WordPress アドレス (URL)とサイトアドレス (URL)を移行先のURLに書き換えています。

記事内のデータに関してはリンクや画像などを追加するとき直で参照先を記載するWPの仕様なので記事内容のみ文字列を新しいURLに置換しています。
記事はwp_postsテーブルのpost_contentに格納されています。

ちなみにエクスポートしたsqlファイルを編集してURLを全て一括で置換してからインポートするやり方はウィジットが消えたりめちゃくちゃになったので辞めておいたほうが無難です。

.htaccessの修正

http、https、wwwあり・なしなどを統一したりしてる場合
ログインURLをプラグイン等で変更している場合などさまざまな場合がありますので自身の環境に合わせた修正が必要です。

例)ローカルのblogフォルダにWPを入れて検証する場合

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /blog/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]
</IfModule>
# END WordPress

原因不明

外観->メニューのURLがどこで設定されているか分かっていないためメニューのURLだけWPの管理画面から編集した。
タグをどこかのファイルに書き出しているのかも?

Laravel ログイン画面作成

ここではLaravelでログイン画面を作成してログイン成功画面へのリダイレクトまでを行いたいと思います。

環境
Laravel:5.8
PHP:7.1.3
OS:Win10 XAMPP
ツール:Composer
DB:MySQL

やる事の順番
1.DBにログインする情報を設定
2.URLのルーティング
3.コントローラー作成
4.View作成
5.モデル作成

1.DB設定ファイル

config\database.php

'default' => env('DB_CONNECTION', 'mysql'),

'mysql' => [
    'driver' => 'mysql',
    'url' => env('DATABASE_URL'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'laravel_test'),
    'username' => env('DB_USERNAME', 'root'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    ]) : [],
],

\.env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_test
DB_USERNAME=root
DB_PASSWORD=

2.URLのルーティング

routes/web.php

//Route::get('/', function () {
//    return view('welcome');
//});

Route::get('/login', 'LoginController@index');
Route::post('/login/post', 'LoginController@post');
Route::get('/admin', 'AdminController@index');

http://localhost/laravel/loginにGETでアクセスするとLoginControllerのindexメソッドが呼ばれる。
http://localhost/laravel/login/postにPOSTでアクセスするとLoginControllerのPOSTメソッドが呼ばれる。
以下略

3.コントローラー作成

app/Http/Controllers\LoginController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Model\MstUser;

class LoginController extends Controller
{
    public function index()
    {
        $arrCSS = $this->setCSS();
        $arrJS = $this->setJS();
        return view('login', ['arrCSS' => $arrCSS, 'arrJS' => $arrJS]);
    }

    public function post(Request $req)
    {
        $table = new MstUser;
        $login = $table->isLogin($req->user_id, $req->pass);
        if (empty($login)) {
            return view('login', ['errorMsg' => 'ログインできませんでした']);
        } else {
            return redirect()->action('AdminController@index');
        }
    }

    public function setCSS() {
        $arrCSS = array();
        array_push($arrCSS, '/css/app.css');
        return $arrCSS;
    }

    public function setJS() {
        $arrJS = array();
        array_push($arrJS, '/js/app.js');
        return $arrJS;
    }
}

app/Http/Controllers\AdminController.php

<?php

namespace App\Http\Controllers;

class AdminController extends Controller
{
    public function index()
    {
        return view('admin');
    }
}

return viewの第二引数でviewに変数を渡しています。
筆者はページ固有の情報があればコントローラーで設定していく感じにしてます。

4.View作成

resources\views以下に作成
今回はヘッダーやフッターファイルを使いまわせるようにlayoutsフォルダを作成しサイトの雛形を作成します。
resources\views\layouts\app.blade.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>@yield('title')</title>
@isset($arrCSS)
    @foreach ($arrCSS as $val)
        <link rel="stylesheet" href="{{ asset($val) }}">
    @endforeach
@endisset
@isset($arrJS)
    @foreach ($arrJS as $val)
    <script type="text/javascript" src="{{ asset($val) }}"></script>
    @endforeach
@endisset
</head>
<body>
    <div class="container">
    @include('layouts.header')
    @yield('content')
    @include('layouts.footer')
    </div>
</body>
</html>

ページ毎に切り替えて使いまわす部分
タイトル、CSS、Js、コンテンツ部
resources\views\layouts\以下にheader.blade.php、footer.blade.phpファイルを作成します。
ヘッダー、フッターの確認ができればいいので中身は何でもいいです。

次にログイン画面@yield(‘content’)の部分を作成していきます。
resources\views\login.balade.php

@extends('layouts.app')

@section('title', 'ログイン画面')

@section('content')
<form action="{{ url('login/post')}}" method="POST">
@csrf
ID:<input type="text" name="user_id">
Pass:<input type="text" name="pass">
<input type="submit" value="送信">
</form>
@isset($errorMsg)
{{ $errorMsg }}
@endisset
@endsection

resources\views\admin.balade.php

@extends('layouts.app')

@section('title', 'ログイン成功')

@section('content')
ログインできました。
@endsection

5.モデル作成

app/Model\MstUser.php

<?php

namespace App\Model;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;

class MstUser extends Model
{
    protected $table = 'mst_user';
    protected $guarded = ['id'];

    public function isLogin($userId, $pass)
    {
        $sql = "SELECT id "
             . "  FROM mst_user "
             . " WHERE user_id = '{$userId}' "
             . "   AND pass = '{$pass}' ";
        return DB::select($sql);
    }

}

モデルは好きな場所に作成できます。
モデルを作成した場所をnamespaceに記述してください。

Laravel URLのpublicを消す

ここではLaravel URLのpublicを消す方法について解説していきます。

環境
Laravel:5.8
PHP:7.1.3
OS:Win10 XAMPP
ツール:Composer

http://localhost/laravel/public/

http://localhost/laravel/

publicフォルダの中身をlaravel直下に展開する

http://localhost/laravel/でアクセスすると下記エラーが発生。

Warning: require(C:\xampp\htdocs\laravel/../vendor/autoload.php): failed to open stream: No such file or directory in C:\xampp\htdocs\laravel\index.php on line 24
Fatal error: require(): Failed opening required ‘C:\xampp\htdocs\laravel/../vendor/autoload.php’ (include_path=’C:\xampp\php\PEAR’) in C:\xampp\htdocs\laravel\index.php on line 24

index.phpを移動したのでいろいろパスが合わなくなっているので
24行目からパスを通しなおす。

laravel直下に置いたindex.phpの修正

require __DIR__.'/vendor/autoload.php'; //24行目 ../を消してパスを通す
$app = require_once __DIR__.'/bootstrap/app.php'; //38行目 ../を消してパスを通す

http://localhost/laravel/でアクセスしてlaravel画面が表示されたら完了