laravel 5.5中的自定义身份验证未登录?

时间:2017-12-23 16:43:34

标签: php laravel laravel-5 laravel-5.5 laravel-authorization

我正在学习laravel,我决定在laravel中进行自定义身份验证。我可以注册我的用户,但当我尝试登录时,我收到此错误?

Type error: Argument 2 passed to Illuminate\Auth\SessionGuard::__construct() must implement interface Illuminate\Contracts\Auth\UserProvider, null given, 

这些是我的资源 我的AdminUser模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model as Eloquent;
use Illuminate\Notifications\Notifiable;
use Illuminate\Auth\Authenticatable as AuthenticableTrait;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
class AdminUser extends Eloquent implements AuthenticatableContract,AuthorizableContract
{
    public $table = "admin_users";
    use Notifiable;
    use AuthenticableTrait;
    use Authorizable;
    protected $fillable = [
        'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}

我的AdminUserController

<?php
namespace App\Http\Controllers;
use App\AdminUser;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use App\Http\Requests\LoginRequest;
use App\Http\Requests\RegisterRequest;
use Auth;
use Response;

class AdminUserController extends Controller {

    use AuthenticatesUsers;
    /**
     * the model instance
     * @var AdminUser
     */
    protected $user;
    /**
     * The Guard implementation.
     *
     * @var Authenticator
     */
    protected $admin;

    /**
     * Create a new authentication controller instance.
     *
     * @param  Authenticator  $admin
     * @return void
     */
    public function __construct(Guard $admin, AdminUser $user)
    {
        $user = AdminUser::first();
        Auth::login($user);

        $this->middleware('admin', ['except' => ['getLogout']]);
    }

    /**
     * Show the application registration form.
     *
     * @return Response
     */
    public function getRegister()
    {
        return view('admin/admin_users/register');
    }

    /**
     * Handle a registration request for the application.
     *
     * @param  RegisterRequest  $request
     * @return Response
     */
    public function postRegister(RegisterRequest $request)
    {
        AdminUser::create([
            'email' => $request->email,
            'password' => bcrypt($request->password),
        ]);
        return redirect('backend-admin/dashboard');
    }

    /**
     * Show the application login form.
     *
     * @return Response
     */
    public function getLogin()
    {
        return view('admin/admin_users/login');
    }

    /**
     * Handle a login request to the application.
     *
     * @param  LoginRequest  $request
     * @return Response
     */
    public function postLogin(LoginRequest $request)
    {
        if (Auth::guard('admin')->attempt($request->only('email', 'password')))
        {
            return redirect()->intended('/backend-admin/dashboard');
        }

        return redirect('/backend-admin')->withErrors([
            'email' => 'The credentials you entered did not match our records. Try again?',
        ]);
    }

    /**
     * Log the user out of the application.
     *
     * @return Response
     */
    public function getLogout()
    {
        Auth::guard('admin')->logout();

        return redirect('/backend-admin');
    }
    protected function guard()
    {
        return Auth::guard();
    }

}

我的VerifyAdmin中间件

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Support\Facades\Auth;

class VerifyAdmin
{
    /**
     * The Guard implementation.
     *
     * @var Guard
     */
    protected $admin;

    /**
     * Create a new filter instance.
     *
     * @param  Guard  $auth
     * @return void
     */
    public function __construct(Guard $auth)
    {
//        dd($auth);
        $this->admin = $auth;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($this->admin->guest())
        {
            if ($request->ajax())
            {
                return response('Unauthorized.', 401);
            }
            else
            {
                return redirect()->guest('backend-admin');
            }
        }

        return $next($request);
    }

}

我还在auth.php中定义了警卫

<?php

return [

    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
    ],
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
        'admin' => [
            'driver' => 'eloquent',
            'model' => App\AdminUser::class,
        ],
    ],
    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],

];

还在kernel.php中定义了中间件

protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::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,
    'admin' => \App\Http\Middleware\VerifyAdmin::class,

如果我在任何地方错了或者我错过了什么,请随时纠正我。

3 个答案:

答案 0 :(得分:1)

我发现了什么是我的程序错误,我在我的控制器中定义了防护功能,但忘记在功能中添加防护,我通过定义防护来修复它。

答案 1 :(得分:0)

我认为问题是这两行:

$user = AdminUser::first();
Auth::login($user);

运行它的重点是什么?首先,我看到你在这里有登录操作,看起来你在登录页面时自动登录管理员 - 它没有多大意义。

另外,这两行不会做任何我认为应该做的事情 - 因为当管理员登录时,你将他登录,所以假设你使用的话,没有必要在每个请求中登录他会话。

答案 2 :(得分:0)

您需要将管理员名称从admin更改为admins

<?php

return [

    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
    ],
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
        'admins' => [  // ***this is the change that should be made***
            'driver' => 'eloquent',
            'model' => App\AdminUser::class,
        ],
    ],
    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],

];