实现用户登录
打赏作者

elijah523
 if(Auth::attempt(array('email'=>$request->get('email'),
            'password'=>$request->get('password'))))

一直返回false

水云间chinahuanqiu 回复 elijah523

怎么解决的?我的也是

JellyBool

你确定你的邮箱和密码是对应的和正确地么 @elijah523

elijah523

我新注册了一个用户,然后登录,就好用

elijah523

谢谢老师

JellyBool

问题解决了? @elijah523 ,解决了就OK

elijah523

用户通过验证了 在 signin方法里 \Auth::check();为1
\Auth::user()->name;这个也能取到值
在app.blade.php中 \Auth::check()是false { Auth::user()->name };也取不到值并且这句报错

JellyBool

app.blade.php是使用Auth::check(),在signin方法里,你在哪里使用\Auth::user()->name,把你这几个部分的代码贴出来看看 @elijah523

Lennon

Jelly, 你好,课程看完了有个写法不是很明白,在UserController中使用\Auth::attempt的时候加一个\是什么意思呢?在app.blade.php使用Auth::check的时候没有使用\。这个是命名空间的问题吗?

JellyBool

是命名空间的问题 @Lennon 你可以先看看OOP基础那块

lzy13121013 回复 JellyBool

我也不是很理解这块啊,为什么在app.blade.php文件中,会成功调用Auth::check()方法呀。laravel怎么找到的Auth这个类啊。

JellyBool 回复 lzy13121013

暂时你学这个系列的话,可以先跟着写。不然你可以先去看看 深入 laravel 核心的系列

ciotas

@JellyBool 每次登陆成功之后跳转到首页都出现“laravel.dev 将您重定向的次数过多”的问题,导致页面无法访问,请问可能是什么情况呢。
这是我所有的路由

 Route::resource('posts','PostsController');
    Route::get('/user/register','UsersController@register');
    Route::get('/user/login','UsersController@login');
    Route::post('/user/login','UsersController@signin');
    Route::get('/verify/{confirm_code}','UsersController@confirmEmail');
    Route::resource('user','UsersController');
    Route::get('/', 'HomeController@index');
JellyBool 回复 ciotas

你的 laravel 版本是多少?你的:

Route::get('/', 'HomeController@index');

的 middleware 是什么,这个基本上就是 middleware 的问题引起的

ciotas 回复 JellyBool

@JellyBool 我的版本号是 5.2.45 ,HomeController的middleware 是

public function __construct()
    {
        $this->middleware('guest');
    }

我尝试注释掉了这个middleware,问题解决了,请问什么原因呢。

JellyBool 回复 ciotas

middleware('guest') 就是未登录的用户才访问的页面,你一登录进来就直接使用户跳转到login页面,但是用户已经登录进来了,又需要跳转到 /,这样循环跳转,就出问题了

chenxin

1.我想说我看了文档上面的记住我的功能,他给的代码我有个疑问:

if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
    // 这个用户被记住了...
}

前面两个变量是post表单传来的数据,第三个$remember如果也是传过来的,那么这个是一个怎样的字符串啊!我猜想的是数据库的remember_token,但是用户都没有登录怎么可能传token呢?难道是一个用户将check选中后传到控制器的是一个bool值么?然后在控制器里进行操作?
2.继续问一个,我想问问题的时候如果去社区发个帖子你那边有提醒吗?因为在这边发布自己问题你回复的比较快!

JellyBool 回复 chenxin
$remember = $request->has('remember') ? true : false;

if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
    // 这个用户被记住了...
}
if (Auth::viaRemember())
{
//判断用户是否使用 remember_me 登录
}

2.发帖是有提示的。

YVEND

return redirect(’/user/login’)->withInput(); 我故意输错密码,但是刷新后的页面并么有把之前填写邮箱返回到页面上。

JellyBool 回复 YVEND

确保你正确设置 session ,还是直接贴你的 controller 和 视图的代码吧

YVEND 回复 JellyBool
{ csrf_field() }
                <div class="form-group">
                    <label for="inputPassword3"  >密码</label>
                    <input type="password" name="password" class="form-control" id="inputPassword3" placeholder="密码">
                </div>
              <div class="form-group">
                    <div class="">
                        <button type="submit" class="form-control btn btn-default">登录</button>
                    </div>
                </div>
            </form>
YVEND 回复 JellyBool

Controller 代码
public function signin(Requests\UserLoginRequest $request)
{

if (Auth::attempt([

    'email'=>$request->get('email'),

    'password'=>$request->get('password'),

    'is_confirmed'=>1

])){

    return redirect('/');

}else{

    Session::flash('user_login_failed','密码不正确或邮箱不正确');

    return  redirect('/user/login')->withInput(['email'=>$request->get('email')]);

}

}
JellyBool 回复 YVEND

你试试这样:

                <div class="form-group">
                   <label for="inputEmail3" >邮箱</label>
                    <input type="email" name="email" value="{ old('email')}" class="form-control " id="inputEmail3" placeholder="邮箱">
                </div>
YVEND 回复 JellyBool

可以了。thanks~

578101804

\Auth::attempt 这个方法在哪里看他的实现方法?可以自己写么?

JellyBool 回复 578101804

你是说源码?你看看 vendor/laravel/src/ 下面的 Auth 部分

kvcr945a

如果修改User.php名称或者移动User.php,使用Auth::attempt会出现错误,怎么解决

JellyBool 回复 kvcr945a

修改你的 config/auth.php 的配置文件

'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class, // 这里修改为你的改过的
        ],
blaze0207

奇怪我輸入的信箱跟密碼是對的~~~!!!
但卻一直說我錯誤…
這會是哪裡有問題呢?

我還把 email 跟 password 個別打回前端看,的確有值,值也正確,我密碼為 11111111 (8個1)
這一定不會打錯的~~可是還是一直報錯~找不太到為什麼@@

JellyBool 回复 blaze0207

你确认一下密码在保存的时候有没有两次加密

blaze0207 回复 JellyBool

看起來是很正常的加密一次存入資料庫~!

搞不懂為什麼@@找了幾個小時了~找不到問題!

JellyBool 回复 blaze0207

你拿数据库这一段加密后的 password 使用 Hash::check 来跟明文密码检查一下。

下次在 github 发图片的时候,记得使用 markdown 格式,![](image-url)

blaze0207 回复 JellyBool

不好意思下次我會注意~!
我剛剛試了Hash::check 一直回傳 false

後來我乾卻不加密去測試,也是回傳 false!!
不知道如何解決@@

我剛在測試了一下:
如果我
return $request->get(‘email’); 有值並正確!

反之
return Auth::attempt([‘email’ => $request->get(‘email’),]); 就回傳 false

這樣子的話有可能會是什麼原因呢?
不好意思一直發問打擾~!

PS:我不是用原生的 users table,我是另外創一個 admin_users table
我也有去改過 config/auth.php 的 provider,結果也是一樣~!

JellyBool 回复 blaze0207

剛剛試了Hash::check 一直回傳 false

就是密码不多吧

blaze0207 回复 JellyBool

請問密碼不多是什麽意思?

JellyBool 回复 blaze0207

密码不对。。。Hash::check() 都是 false

blaze0207 回复 JellyBool

後來我整個砍掉,重新做一次,完全用 laravel 預設的

1.加密拿掉
2.用原生users table
最後一步到登入輸入信箱和密碼
一樣還是報錯~~我已經不知道怎解這個問題了!

JellyBool 回复 blaze0207

额。。这么奇怪。

有注意过表的大小写么?

blaze0207

@JellyBool
終於解決掉此問題!!!!
我在此總結一下~~!

1:問題出在 laravel 對於 password 這個 key name 有強制性!
也就是說,即使存入DB的時候是明碼,但在做 login 時,laravel會自動把它轉成加密後才去比對,
因此永遠都不會比對正確.

2.至於一開始的方法加密後在儲存,並且一直在login報錯,後來這幾天我再照著您教學試又正常了,
估計可能我前幾次手誤或是漏了哪邊吧,才會導致一直 login 報錯的狀況,真是抱歉~!

JellyBool 回复 blaze0207

可以可以,问题解决了就OK

EddyAnn 回复 blaze0207

你是怎么解决的,重点在这里

EddyAnn

我也遇到了类似的情况,总是验证不对

blaze0207 回复 EddyAnn

@EddyAnn 你好:

我當初的狀況是因為我在註冊的時候 password 沒有加密就寫進去 table,
laravel 的 Auth 對於 password 這部分似乎不予許這樣做,
所以解決方法就是在註冊的時候 password 必須要加密過後才寫進去 table,程式碼如下:

public function postRegister(Request $request)
    {
        if (Admin::where('email', $request->email)->first()) {
            return '此信箱已經被註冊';
        }

        Admin::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password)
        ]);
        return redirect('admin');
    }

這樣在登入的時候就可以正常了~!