Laravel-admin 重写用户登录,在 postLogin 方法中无法写入 session,猜测是否 attempt 方法执行不对?

  • Laravel Version: 5.5.40
  • PHP Version:7.2.4
  • Laravel-admin: 1.5x-dev

Description:

重写用户登录过程中,创建了对应的providerroutecontroller、但是在登录过程中一直跳转不到后台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.phpadmin.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.

@哪位好汉!能提点一下!在下感激不尽!

面向Google编程
drinke9
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
drinke9
最佳答案

@banjvqi
issue中,作者已经给出了解决方案了,https://github.com/z-song/laravel-admin/is...\
修改admin中的对应数据库指向就可以了,你可以尝试下。

5年前 评论
讨论数量: 4

你好 楼主 这个问题解决了吗 我也碰到了

5年前 评论
drinke9

@banjvqi
issue中,作者已经给出了解决方案了,https://github.com/z-song/laravel-admin/is...\
修改admin中的对应数据库指向就可以了,你可以尝试下。

5年前 评论

@drinke9 我也看了解决方案,但是还是没有达到我的需求啊! 数据库表,是自己建立的,token也是自己加密的! 现在用的laravel-admin后台系统,登陆这块..... 想重写这块。 laravel-admin 验证的时候 验证我自己的表和token。登陆后还是使用laravel-admin的整体框架!! 求指点,可以红包解决!149799880 球球啊,着急!希望大佬带带。

4年前 评论

好像确实不能走通session,求解……

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!