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

後藤 祐一 について

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

Laravel ミドルウェアで独自のログイン機能を実装する

Laravelで二段階認証とか既存のAuthを使わずにミドルウェアでいろいろやったのでまとめ。

環境
Laravel:5.5 LTS

独自のAuthクラスを作成

app/Http/Middleware/Auth.php

<?php

namespace App\Http\Middleware;

use Illuminate\Support\Facades\Redirect;
use Closure;

class Auth
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!session()->has('loginFlg')) {
            return redirect('admin/login');
        }
        return $next($request);
    }
}

セッションのログインフラグが立ってなかったらログイン画面へリダイレクト。

自作したAuthクラスをルートへ登録

app/Http/kernel.php

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
//        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth' => \App\Http\Middleware\Auth::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    ];

既存のAuthと名前が被るのでコメントアウトして追加

ルートに対しミドルウェアを指定

routes/web.php

Route::group(['middleware' => ['auth']], function () {
    Route::get('admin/my', 'Admin\MyController@index');
    Route::get('/', function () {
        return view('welcome');
    });
});

管理画面はログインフラグが立ってないとログイン画面にリダイレクトさせたいので管理画面のルートはgroup内に追加していく。
welcomeはログインフラグが立ってない場合ログイン画面にリダイレクトするかのテスト。
myページとwelcomeページにアクセスしてログインフラグが立っていないときちゃんとリダイレクトしたのでこの書き方でまとめて記載していく。

PHP wkhtmltopdf SnappyでPDF出力

今までTCPDTやmPDFを使ってたのですがHTML5 + CSS3のWebページを丸ごとPDF化する必要がありレイアウトのズレが実装できるレベルじゃなかったのでwkhtmltopdf Snappyを調べました。

環境
Windows10
XAMPP
PHP7.3

require "knp-snappy/vendor/autoload.php";
use Knp\Snappy\Pdf;
$snappy = new Pdf('"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe"');
// $snappy->setBinary('"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe"')
$html = <<<EOF
<style></style>
<p>ここにHTMLを書く</p>
EOF;
// PDFをブラウザに出力
//header("Content-Type: application/pdf");
//echo $snappy->getOutputFromHtml($html);
// 保存
$snappy->generateFromHtml($html, 'download.pdf');

はまった点

setBinaryなどでバイナリのパスを渡すときはコマンド扱いになるのでダブルクォーテーションで囲むのを忘れていてはまりました。

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の管理画面から編集した。
タグをどこかのファイルに書き出しているのかも?