Laravel-admin 重写用户登录,在 postLogin 方法中无法写入 session,猜测是否 attempt 方法执行不对?
- Laravel Version: 5.5.40
- PHP Version:7.2.4
- Laravel-admin: 1.5x-dev
Description:
重写用户登录过程中,创建了对应的provider
、route
、controller
、但是在登录过程中一直跳转不到后台Dashbord页面,猜测是否是在 Auth::guard('admin')->attempt($credentials)
这一步没有成功写入session。
Steps To Reproduce:
-
表结构
参考博客-- local_auths public function up() { Schema::create('local_auths', function (Blueprint $table) { $table->increments('id'); $table->integer('user_id',false,false)->index()->comment('用户ID'); $table->string('phone',20)->unique(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); } -- users Schema::create('users', function(Blueprint $table){ $table->increments('id'); $table->string('nick_name', 191)->comment('昵称'); $table->string('real_name', 191)->nullable()->comment('姓名'); $table->date('birthday')->nullable()->comment('生日'); $table->tinyInteger('is_store', false, false)->default(0)->comment('是否是商家1:是'); $table->string('avatar')->default('default')->comment('头像地址'); .... });
-
AuthServiceProvider.php
<?php namespace App\Providers; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider { /** * The policy mappings for the application. * * @var array */ protected $policies = [ 'App\Model' => 'App\Policies\ModelPolicy', ]; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); //此处修改 Auth::provider('custom', function ($app, array $config) { return new StoreServiceProvider($this->app['hash'], $config['model']); }); } }
-
StoreServiceProvider.php
<?php namespace App\Providers; use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Contracts\Auth\UserProvider; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Str; use Illuminate\Contracts\Hashing\Hasher as HasherContract; class StoreServiceProvider implements UserProvider { protected $hasher; protected $model; public function __construct(HasherContract $hasher, $model) { $this->model = $model; $this->hasher = $hasher; } public function retrieveById($identifier) {} public function retrieveByToken($identifier, $token) {} public function updateRememberToken(Authenticatable $user, $token) {} public function retrieveByCredentials(array $credentials) { if (empty($credentials) || (count($credentials) === 1 && array_key_exists('password', $credentials))) { return; } $query = $this->createModel()->newQuery(); // $credentials['phone'] = $credentials['username']; // unset($credentials['username']); // dd($credentials); foreach ($credentials as $key => $value) { if (! Str::contains($key, 'password')) { $query->where($key, $value); } } return $query->first(); } public function validateCredentials(Authenticatable $user, array $credentials) { // dd($credentials); // dd($user); $plain = $credentials['password']; // dd(Hash::check($plain, $user->getAuthPassword())); return $this->hasher->check($plain, $user->getAuthPassword()); } public function createModel() { $class = '\\'.ltrim($this->model, '\\'); return new $class; } }
-
AuthController.php
<?php namespace App\Http\Controllers\Store\Controllers; use Encore\Admin\Auth\Database\Administrator; use Encore\Admin\Facades\Admin; use Encore\Admin\Form; use Encore\Admin\Layout\Content; use Illuminate\Http\Request; use Illuminate\Routing\Controller; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Lang; use Illuminate\Support\Facades\Redirect; use Illuminate\Contracts\Session\Session; use Illuminate\Support\Facades\Validator; class AuthController extends Controller { /** * Login page. * * @return \Illuminate\Contracts\View\Factory|Redirect|\Illuminate\View\View */ public function getLogin() { if (!Auth::guard('admin')->guest()) { return redirect(config('admin.route.prefix')); } return view('admin::login'); } /** * @param Request $request * * @return mixed */ public function postLogin(Request $request) { $credentials = $request->only(['phone', 'password']); $validator = Validator::make($credentials, [ 'phone' => 'required', 'password' => 'required', ]); if ($validator->fails()) { return Redirect::back()->withInput()->withErrors($validator); } // dd(Auth::guard('admin')); if (Auth::guard('admin')->attempt($credentials)) { admin_toastr(trans('admin.login_successful')); // dd(session()); return redirect()->intended(config('admin.route.prefix')); } return Redirect::back()->withInput()->withErrors(['phone' => $this->getFailedLoginMessage()]); } ....(略)以下未修改
-
routes.php
、admin.php
-- routes.php
use Illuminate\Routing\Router;
Admin::registerAuthRoutes();
Route::group([
'prefix' => config('admin.route.prefix'),
'namespace' => config('admin.route.namespace'),
'middleware' => config('admin.route.middleware'),
], function (Router $router) {
$router->get('auth/login', 'AuthController@getLogin');
$router->post('auth/login', 'AuthController@postLogin');
$router->get('/', 'HomeController@index');
});
-- admin.php
/*
* Laravel-admin auth setting.
*/
'auth' => [
'guards' => [
'admin' => [
'driver' => 'session',
'provider' => 'admin',
'provider' => 'store',
],
],
'providers' => [
'admin' => [
'driver' => 'eloquent',
'model' => Encore\Admin\Auth\Database\Administrator::class,
],
'store' =>[
'driver' => 'custom',
'model' => App\Models\LocalAuth::class,
]
],
],
....
/*
* Laravel-admin database setting.
*/
'database' => [
// Database connection for following tables.
'connection' => '',
// User tables and model.
'users_table' => 'users',
// 'users_model' => Encore\Admin\Auth\Database\Administrator::class,
'users_model' => App\Models\User::class,
// Role table and model.
....
LocalAuth.php
<?php
namespace App\Models;
use Encore\Admin\Auth\Database\HasPermissions;
use Encore\Admin\Traits\AdminBuilder;
use Illuminate\Auth\Authenticatable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Database\Eloquent\Model;
/**
* Class Administrator.
*
* @property Role[] $roles
*/
class LocalAuth extends Model implements AuthenticatableContract
{
use Authenticatable, AdminBuilder, HasPermissions;
protected $hidden = [
'password', 'remember_token',
];
public function user()
{
return $this->belongsTo('App\Models\User');
}
}
User.php
<?php
namespace App\Models;
use Encore\Admin\Auth\Database\HasPermissions;
use Encore\Admin\Traits\AdminBuilder;
use Illuminate\Auth\Authenticatable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Database\Eloquent\Model;
/**
* Class Administrator.
*
* @property Role[] $roles
*/
class User extends Model implements AuthenticatableContract
{
use Authenticatable, AdminBuilder, HasPermissions;
// protected $fillable = ['nick_name', 'real_name', 'birthday', 'avatar'];
/**
* Create a new Eloquent model instance.
*
* @param array $attributes
*/
public function __construct(array $attributes = [])
{
$connection = config('admin.database.connection') ?: config('database.default');
$this->setConnection($connection);
$this->setTable(config('admin.database.users_table'));
parent::__construct($attributes);
}
public function localAuth()
{
return $this->hasOne('App\Models\LocalAuth');
}
}
具体文件变化就是这些,目前在登录页面输入正确口令无法跳转,在postLogin
方法中看不到对应session.
推荐文章: