php-laravel框架用户验证(Auth)模块解析(三)登录模块

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/loophome/article/details/84108302

一、登录模块路由

路由名称 请求方式 方法实现
/login GET 登录页面
/login POST 实现登录功能
/logout POST 实现登出功能

二、控制器解析

跟注册的控制器一样,大部分的逻辑使用trait引入。

$redirectTo配置,如果在登录状态,重定向的页面

protected $redirectTo = '/home';

非常简单一个控制器。

三、登录状态判断

登录状态判断与使用,使用Auth facade 来判断

// 获取当前通过认证的用户
$user = Auth::user(); 

// 获取当前通过认证的用户 ID
$id = Auth::id();

//判断是否已登录
Auth::check();

在blade模板中,可以使用@guest标签来处理

@guest
  未登录
@else
  已登录,用户名:{{ Auth::user()->name }}                    
@endguest

四、扩展开发:自定义的登录行为

默认生成的代码,使用email进行登录,这里我们尝试修改为可使用用户名、电子邮箱、手机号这三种方式之一来登录。

1)在auth/login.blade.php模板中,把email字段修改为login_name(当然,这个字段是自定义的)

2)修改登录的行为

登录行为位于Illuminate\Foundation\Auth\AuthenticatesUsers::login方法中

$this->validateLogin($request); 

验证登录参数,由于我们改了字段,需要重写这个方法,并修改sendFailedLoginResponse的提示信息。

    protected function validateLogin(Request $request)
    {
        $this->validate($request, [
            'login_name' => 'required|string',
            'password' => 'required|string',
        ]);
    }

    protected function sendFailedLoginResponse(Request $request)
    {
        throw ValidationException::withMessages([
            'login_name' => [trans('auth.failed')],
        ]);
    }

$this->attemptLogin($request);

实现登录逻辑,需要循环3个字段查找。$this->guard()->attempt实现了从数据库中获取User实例。

    protected function attemptLogin(Request $request)
    {
        foreach (['name', 'email', 'phone'] as $loginName) {
            $requestArr = [
                $loginName => $request->input('login_name'),
                'password' => $request->input('password'),
            ];
            $loginStatus = $this->guard()->attempt(
                $requestArr, $request->filled('remember')
            );
            if ($loginStatus) {
                return $loginStatus;
            }
        }
        return false;
    }

Ok,我们自定义的登录行为就完成了,可以看看我的demo:http://shebao.bytrees.com/login​​​​​​​

猜你喜欢

转载自blog.csdn.net/loophome/article/details/84108302