Laravelã¨ã¯PHPã®ä¸ã§ä»Šæœ€ã‚‚伸ã³ã¦ã„るフレームワークã§ã™ã€‚
処ç†é€Ÿåº¦ãŒé…ã„ãªã©ã‚ã‚Šã¾ã™ãŒã€ã‹ãªã‚Šä½¿ã„安ã拡張性ãŒé«˜ã„ã¨æ€ã£ã¦ã„ã¾ã™ã€‚
今回ã¯ã€Larabel5.2ã‹ã‚‰å¯¾å¿œã•ã‚ŒãŸMultiAuthを紹介ã—ã¾ã™ã€‚
MultiAuthãªã®ã§ã€è¤‡æ•°ã®èªè¨¼ã§ã™ã€‚
今回ã¯ã€ä¸€èˆ¬ãƒ¦ãƒ¼ã‚¶ãƒ¼ï¼ˆusers)・管ç†ãƒ¦ãƒ¼ã‚¶ãƒ¼ï¼ˆadmins)ã®2ã¤ãƒ†ãƒ¼ãƒ–ルを使用ã—ãŸèªè¨¼å‡¦ç†ã‚’実装ã—ã¾ã™ã€‚
$ composer create-project laravel/laravel project --prefer-dist
ã“ã‚Œã§ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆãŒç”Ÿæˆã•ã‚Œã¾ã—ãŸã€‚
.env ã«DBæŽ¥ç¶šæƒ…å ±ã‚’è¨å®šã—ãŸå¾Œã€cdã—ã¾ã™ã€‚
$ cd project
一般ユーザー用ã®èªè¨¼ã‚’作æˆã—ã¾ã™ã€‚
ã¾ãšã¯ç”»é¢ç‰ã‚’生æˆã€‚
$ php artisan make:auth
次ã«ãƒ†ãƒ¼ãƒ–ルを生æˆ
$ php artisan migrate
ã“れ㧠migrationsã€password_resetsã€usersテーブルãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚
モデルを生æˆã—ã¾ã™ã€‚
$ php artisan make:model Admin
app/User.php ã¨åŒã˜ã«ã™ã‚‹
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Admin extends Authenticatable
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
//
}
adminsテーブルを生æˆ
$ php artisan make:migration create_admin_table
ã“ã¡ã‚‰ã‚‚usersテーブルã«åˆã‚ã›ã‚‹
database/migrate/xxxxxxx_create_admin_table.php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateAdminTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('admins', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password', 60);
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('admins');
}
}
users,adminsテーブルã®åˆæœŸãƒ‡ãƒ¼ã‚¿ã‚’è¨å®šã™ã‚‹seederを作æˆ
$ php artisan make:seeder UserTableSeeder
$ php artisan make:seeder AdminTableSeeder
database/seeds/UserTableSeeder.php
use Illuminate\Database\Seeder;
class UserTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('users')->truncate();
DB::table('users')->insert([
'name' => 'ユーザー',
'email' => 'user@example.com',
'password' => bcrypt('password'),
]);
}
}
database/seeds/AdminTableSeeder.php
use Illuminate\Database\Seeder;
class AdminTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('admins')->truncate();
DB::table('admins')->insert([
'name' => '管ç†è€…',
'email' => 'admin@example.com',
'password' => bcrypt('password'),
]);
}
}
DatabaseSeeder.php ã«ç™»éŒ²
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$this->call(UserTableSeeder::class);
$this->call(AdminTableSeeder::class);
}
}
migration,seedを実行
$ php artisan migrate:refresh --seed
ドライãƒãƒ¼ã®è¨å®š
config/auth.phpを変更
return [
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
//追åŠ
'user' => [
'driver' => 'session',
'provider' => 'users',
],
//è¿½åŠ for admin
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
//è¿½åŠ for admin
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
],
'passwords' => [
'users' => [
'provider' => 'users',
'email' => 'auth.emails.password',
'table' => 'password_resets',
'expire' => 60,
],
//è¿½åŠ for admin
'admin' => [
'provider' => 'admins',
'email' => 'auth.emails.password',
'table' => 'password_resets',
'expire' => 60,
],
],
];
ルートをè¨å®š
app/Http/routes.php
Route::group(['middleware' => ['web']], function () {
// admin
Route::group(['middleware' => 'guest:admin'], function () {
Route::get('/admin/login','AdminAuthController@showLoginForm');
Route::post('/admin/login','AdminAuthController@login');
});
Route::group(['middleware' => 'auth:admin'], function () {
Route::get('/admin', 'AdminHomeController@index');
Route::get('/admin/home','AdminHomeController@index');
});
Route::get('/admin/logout','AdminAuthController@logout');
// user
Route::auth();
Route::get('/home', 'HomeController@index');
});
usersã®æ–¹ã¯ã€ã™ã§ã«ç”¨æ„ã•ã‚Œã¦ã„る「Route::auth();ã€ã‚’è¨å®šã—ã€adminsã«ãƒã‚°ã‚¤ãƒ³ãƒ»ãƒã‚°ã‚¢ã‚¦ãƒˆãªã©ã‚’è¿½åŠ ã—ã¦ã„ã¾ã™ã€‚
次ã«ãƒŸãƒ‰ãƒ«ã‚¦ã‚§ã‚¢ã‚’å°‘ã—変更ã—ã¾ã™ã€‚
「// add adminã€ã®if分ãŒè¿½åŠ ã—ãŸãƒµæ‰€ã§ã™ã€‚
app/Http/Middleware/Authenticate.php
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->guest()) {
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
// add admin
if($guard == 'admin'){
return redirect()->guest('/admin/login');
}
return redirect()->guest('login');
}
}
return $next($request);
}
app/Http/Middleware/RedirectIfAuthenticated.php
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
// add admin
if($guard == 'admin'){
return redirect('/admin/home/');
}
return redirect('/');
}
return $next($request);
}
最後ã«controller,viewを作æˆã—ã¾ã™ã€‚
php artisan make:controller AdminAuthController
app/Http/Controllers/AdminAuthController.php
<?php namespace App\Http\Controllers; use App\Admin; use Validator; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\ThrottlesLogins; use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers; class AdminAuthController extends Controller { use AuthenticatesAndRegistersUsers, ThrottlesLogins; protected $guard = 'admin'; protected $redirectTo = '/admin/home'; protected $loginView = 'admin.login'; /** * Create a new authentication controller instance. * * @return void */ public function __construct() { $this->middleware('guest:admin', ['except' => 'logout']); } /** * Get a validator for an incoming registration request. * * @param array $data * @return \Illuminate\Contracts\Validation\Validator */ protected function validator(array $data) { return Validator::make($data, [ 'name' => 'required|max:255', 'email' => 'required|email|max:255|unique:admins', 'password' => 'required|confirmed|min:6', ]); } public function showLoginForm() { if (view()->exists('admin.authenticate')) { return view('admin.authenticate'); } return view('admin.login'); } /** * Create a new user instance after a valid registration. * * @param array $data * @return Admin */ protected function create(array $data) { return Admin::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), ]); } }
php artisan make:controller AdminHomeController
app/Http/Controllers/AdminHomeController.php ã¯ã€æ—¢å˜ã®HomeControllerã®ä¸èº«ã‚’コピーã—ã€ã‚¯ãƒ©ã‚¹å・パスãªã©ã‚’ä¿®æ£ã—ã¦ãã ã•ã„。
viewã®ä½œæˆ
resources/views/ 内ã«adminディレクトリを作æˆã—ã€ä»¥ä¸‹ã®viewファイルをã¾ã‚‹ã”ã¨ã‚³ãƒ”ーã—ã¦ãã¾ã™ã€‚
・resources/views/home.blade.php
・resources/views/auth/login.blade.php
loginã®æ–¹ã¯ã€formã®ãƒ‘スを「url('/admin/login')ã€ã«å¤‰æ›´
以上ã§å®Œäº†ã§ã™ã€‚
/homeã€/admin/homeã®URLã¸æŽ¥ç¶šã—確èªã—ã¦ãã ã•ã„。