laravel 5.4,添加二次验证(管理面板)
laravel 5.4, adding second authentication (admin panel)
我想在 laravel 5.4 中为管理页面创建第二个身份验证。
首先让我描述一下我的问题:
我通过 'web'-guard 有一个可用的用户登录(默认 laravel 授权)。现在我想为管理面板创建第二个身份验证。我还有另一个 table 用于存储名称、令牌(类似于密码)和权限级别。
second/separate table 是页面开发所针对的系统提供的依赖项,因此我无法更改它。
我有管理面板的登录页面,但是当我尝试进行身份验证时,每次都会被重定向回登录页面。
我已经用谷歌搜索了整个事情并找到了一些很好的例子:
https://jamesmcfadden.co.uk/custom-authentication-in-laravel-with-guards-and-user-service-providers
- 其他links在控制器粘贴在pastebin上(link在下面)
但我想不通。
这是我已经做的:
在 config/auth 中添加了第二个 guard,名为“admin”。 php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admin',
]
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'admin' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
]
],
添加了需要的模型
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Admin extends Authenticatable
{
use Notifiable;
protected $fillable = [
'mID',
'mAccount',
'mName',
'mServerIP',
'mAuthority',
'mToken'
];
protected $hidden = [
'mContactIP', 'mToken'
];
protected $table = 'administration';
protected $connection = 'common';
public $timestamps = false;
public function getAuthIdentifierName()
{
return 'mAccount';
}
}
在routes/web中添加了必要的路由。php
Route::group(['prefix' => 'admin'], function () {
Route::get('/login','Auth\ElevationController@showLoginForm')->middleware('web');
Route::post('/login','Auth\ElevationController@elevate');
Route::get('/logout','Auth\ElevationController@demote');
Route::get('/', function (){return redirect('admin/dashboard');});
Route::get('/dashboard', 'AdminController@index');
});
在 app/Http/Middleware 下添加了一个名为 'RedirectIfElevated[= 的新 中间件 93=]' 通过命令 'php artisan make:middleware'
public function handle($request, Closure $next, $guard = 'admin')
{
if (!Auth::guard($guard)->check())
{
if(!Auth::guard('web')->check())
{
return redirect('/');
}
return redirect('/admin/login');
}
return $next($request);
}
并在Kernel.php
protected $routeMiddleware = [
.
.
.
'admin' => \WarShape\Http\Middleware\RedirectIfElevated::class,
];
最后我创建了我的控制器:https://pastebin.com/s6iJgFAB
并创建了 视图
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Elevation</div>
<div class="panel-body">
<form class="form-horizontal" role="form" method="POST" action="{{ url('/admin/login') }}">
{{ csrf_field() }}
<div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
<label for="mToken" class="col-md-4 control-label">Token</label>
<div class="col-md-6">
<input id="mToken" type="password" class="form-control" name="mToken" required>
@if ($errors->has('password'))
<span class="help-block">
<strong>{{ $errors->first('password') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group{{ $errors->has('g-recaptcha-response') ? ' has-error' : '' }}">
<label for="recaptcha" class="col-md-4 control-label">Solve Captcha <br> & Elevate!</label>
<div class="col-md-6">
{!! app('captcha')->display($attributes = [], $lang = app()->getLocale()) !!}
@if ($errors->has('g-recaptcha-response'))
<span class="help-block">
<strong>{{ $errors->first('g-recaptcha-response') }}</strong>
</span>
@endif
</div>
</div>
<input type="hidden" name="mAccount" value="{{ Auth::guard('web')->user()->login }}">
<div class="form-group">
<div class="col-md-8 col-md-offset-4">
<button type="submit" class="btn btn-primary">
Elevate
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
所以我需要回答的问题是:
- 我哪里遗漏了什么?我哪里搞砸了?
希望你能帮我解决这个问题,谢谢你的帮助!
如果我没有回答你的问题,我很抱歉,但是你不能在你的用户 table 中添加一个简单的列,比如 is_admin
并且只授权 [=11] 的用户=] 使用中间件访问管理面板,而不是登录两次?
我使用以下自定义登录方法解决了这个问题:
public function elevate(Request $request)
{
// login
$this->validateLogin($request);
$admin = Admin::where('mAccount', '=', Auth::guard('web')->user()->login)
->where('mToken', '=', $request->input('mToken'))->first();
if($admin){
Auth::guard('admin')->login($admin);
return redirect('/admin/dashboard');
}
else{
throw new \ErrorException('Elevation failed!');
}
}
protected function validateLogin(Request $request)
{
$this->validate($request, [
'mToken' => 'required|string|min:8',
'g-recaptcha-response' => 'required|captcha'
]);
}
我想在 laravel 5.4 中为管理页面创建第二个身份验证。
首先让我描述一下我的问题: 我通过 'web'-guard 有一个可用的用户登录(默认 laravel 授权)。现在我想为管理面板创建第二个身份验证。我还有另一个 table 用于存储名称、令牌(类似于密码)和权限级别。
second/separate table 是页面开发所针对的系统提供的依赖项,因此我无法更改它。
我有管理面板的登录页面,但是当我尝试进行身份验证时,每次都会被重定向回登录页面。
我已经用谷歌搜索了整个事情并找到了一些很好的例子:
https://jamesmcfadden.co.uk/custom-authentication-in-laravel-with-guards-and-user-service-providers
- 其他links在控制器粘贴在pastebin上(link在下面)
但我想不通。
这是我已经做的:
在 config/auth 中添加了第二个 guard,名为“admin”。 php
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin' => [ 'driver' => 'session', 'provider' => 'admin', ] ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], 'admin' => [ 'driver' => 'eloquent', 'model' => App\Admin::class, ] ],
添加了需要的模型
namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class Admin extends Authenticatable { use Notifiable; protected $fillable = [ 'mID', 'mAccount', 'mName', 'mServerIP', 'mAuthority', 'mToken' ]; protected $hidden = [ 'mContactIP', 'mToken' ]; protected $table = 'administration'; protected $connection = 'common'; public $timestamps = false; public function getAuthIdentifierName() { return 'mAccount'; } }
在routes/web中添加了必要的路由。php
Route::group(['prefix' => 'admin'], function () { Route::get('/login','Auth\ElevationController@showLoginForm')->middleware('web'); Route::post('/login','Auth\ElevationController@elevate'); Route::get('/logout','Auth\ElevationController@demote'); Route::get('/', function (){return redirect('admin/dashboard');}); Route::get('/dashboard', 'AdminController@index'); });
在 app/Http/Middleware 下添加了一个名为 'RedirectIfElevated[= 的新 中间件 93=]' 通过命令 'php artisan make:middleware'
public function handle($request, Closure $next, $guard = 'admin') { if (!Auth::guard($guard)->check()) { if(!Auth::guard('web')->check()) { return redirect('/'); } return redirect('/admin/login'); } return $next($request); }
并在Kernel.php
protected $routeMiddleware = [ . . . 'admin' => \WarShape\Http\Middleware\RedirectIfElevated::class, ];
最后我创建了我的控制器:https://pastebin.com/s6iJgFAB
并创建了 视图
@extends('layouts.app') @section('content') <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <div class="panel panel-default"> <div class="panel-heading">Elevation</div> <div class="panel-body"> <form class="form-horizontal" role="form" method="POST" action="{{ url('/admin/login') }}"> {{ csrf_field() }} <div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}"> <label for="mToken" class="col-md-4 control-label">Token</label> <div class="col-md-6"> <input id="mToken" type="password" class="form-control" name="mToken" required> @if ($errors->has('password')) <span class="help-block"> <strong>{{ $errors->first('password') }}</strong> </span> @endif </div> </div> <div class="form-group{{ $errors->has('g-recaptcha-response') ? ' has-error' : '' }}"> <label for="recaptcha" class="col-md-4 control-label">Solve Captcha <br> & Elevate!</label> <div class="col-md-6"> {!! app('captcha')->display($attributes = [], $lang = app()->getLocale()) !!} @if ($errors->has('g-recaptcha-response')) <span class="help-block"> <strong>{{ $errors->first('g-recaptcha-response') }}</strong> </span> @endif </div> </div> <input type="hidden" name="mAccount" value="{{ Auth::guard('web')->user()->login }}"> <div class="form-group"> <div class="col-md-8 col-md-offset-4"> <button type="submit" class="btn btn-primary"> Elevate </button> </div> </div> </form> </div> </div> </div> </div> </div> @endsection
所以我需要回答的问题是:
- 我哪里遗漏了什么?我哪里搞砸了?
希望你能帮我解决这个问题,谢谢你的帮助!
如果我没有回答你的问题,我很抱歉,但是你不能在你的用户 table 中添加一个简单的列,比如 is_admin
并且只授权 [=11] 的用户=] 使用中间件访问管理面板,而不是登录两次?
我使用以下自定义登录方法解决了这个问题:
public function elevate(Request $request)
{
// login
$this->validateLogin($request);
$admin = Admin::where('mAccount', '=', Auth::guard('web')->user()->login)
->where('mToken', '=', $request->input('mToken'))->first();
if($admin){
Auth::guard('admin')->login($admin);
return redirect('/admin/dashboard');
}
else{
throw new \ErrorException('Elevation failed!');
}
}
protected function validateLogin(Request $request)
{
$this->validate($request, [
'mToken' => 'required|string|min:8',
'g-recaptcha-response' => 'required|captcha'
]);
}