Laravel 手动登录功能

Laravel manual login function

我在Laravel 5.5中使用手动登录功能。卡在登录中。并检查所有(5 个相关)堆栈链接,但没有找到任何线索。

Achievement is once user get registered, automatically sign in that user.


错误是

"Type error: Argument 1 passed to Illuminate\Auth\SessionGuard::login() must implement interface Illuminate\Contracts\Auth\Authenticatable, string given, called in Server/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php on line 294 ◀"

if ($validator->fails()) {

//            $messages = $validator->messages();

            return Redirect::to('register')
                ->withErrors($validator)
                ->withInput();

        } else {

            $email = Input::get('email');
            $user = new user;
            $user->name     = Input::get('name');
            $user->email    = Input::get('email');
            $user->password = Hash::make(Input::get('password'));

            $user->save();
//            $userMail = $user->find($email);
            $userMail = User::where('email','=',$email)->first();
            Auth::login($userMail->email, TRUE);

我做错了什么吗?请指导我。

登录函数需要类型为 Authenticatable 的用户,而您刚刚给出了 email 字符串,这就是您收到此错误的原因,要么使用 Auth::loginUsingId($id);

 $user = User::where('email','=',$email)->first();
 Auth::loginUsingId($user->id, TRUE);

或者只是

Auth::login($user);

Auth::login() 函数需要一个 Authenticable 对象。如果你没有弄乱 User class,这将是你需要传入的内容。

Auth::login($user, true);

参考:https://laravel.com/api/5.5/Illuminate/Auth/SessionGuard.html#method_login

你需要像这样pass/return$user

if ($validator->fails()) {

//            $messages = $validator->messages();

            return Redirect::to('register')
                ->withErrors($validator)
                ->withInput();

        } else {

            $email = Input::get('email');
            $user = new user;
            $user->name     = Input::get('name');
            $user->email    = Input::get('email');
            $user->password = Hash::make(Input::get('password'));

            $user->save();
//            

            Auth::login($user);

Auth::loginUsingId($user->id, TRUE);

只需使用 Auth::login($userMail, TRUE); 而不是 Auth::login($userMail->email, TRUE);

更多信息请查看:https://laravel.com/api/5.5/Illuminate/Auth/SessionGuard.html#method_login

$email = $request->email;
    $password = md5($request->password);

    if ($request->remember_me == 1) {
        $cookie =  Cookie::queue('username', $email, time() + 31536000);
    } else {
        $cookie =  Cookie::queue('username', '', time() - 100);
    }

    $user = DB::table('tbl_adminuser')->where('email_address', $email)->where('password', $password)->first();
    $request->session()->put('userData', $user);

=> 您可以在 laravel

中像这样手动登录

Instead of this

Auth::login($userMail->email, TRUE);

Use this

Auth::login($user->id, TRUE);

对于Laravel 7。

手动登录 使用此方法登录。

public function check_login(Request $request)
{
    $credentials = $request->only('username', 'password');
    if (Auth::attempt($credentials)) {
        return redirect('/dashboard');
    } else {
        return redirect('/login')->with('error', 'Invalid Email address or Password');
    }
}

如果您使用的是默认模型 ('User') 以外的其他模型 class,则 -> 导航至 config/auth.php 并编辑此

 'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],

 'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Staff::class,
        ],

注意:我已将 User 替换为我的模型 class Staff.

最后转到您的模型 class,而不是扩展模型,而是扩展用户。即

来自

class Staff extends Model
{

class Staff extends \Illuminate\Foundation\Auth\User
{

就是这样。

根据doc,您可能需要在手动登录用户后重新生成会话:

        $user = User::firstOrCreate([
            // ...
        ], [
            // ...
        ]);

        Auth::login($user);
        $request->session()->regenerate();

        return redirect()->route('dashboard');