Laravel 5自定义身份验证

时间:2016-03-01 21:16:21

标签: php laravel authentication

我正在尝试在laravel 5中编写自己的注册和登录方法,仅用于学习目的,我想知道我是否在正确的轨道上。具体如下:

$this->user->username = $request['username'];

我是否应该对此做任何其他事情,清理或检查它是否是有效的用户名?

其次,我的public function doRegister是否足够这样?验证是在RegisterRequest类中完成的吗?

路线:

Route::get('register', ['as' => 'register', function() {
    return view('register');
}]);

Route::post('register', ['as' => 'register.post', 'uses' => 'AuthController@doRegister']);

AuthController:

<?php

namespace App\Http\Controllers;

use App\User;
use App\Password;
use App\Http\Requests\RegisterRequest;

class AuthController extends Controller
{
    protected $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function doRegister(Password $password, RegisterRequest $request)
    {
        $this->user->username = $request['username'];
        $this->user->password = $password->hash($request['password']);

        $this->user->save();
    }
}

密码型号:

public function hash($password)
{
    $hash = password_hash($password, PASSWORD_BCRYPT);

    return $hash;
}

1 个答案:

答案 0 :(得分:1)

我唯一要添加到此代码中的是确保用户名不是通过RegisterRequest类在数据库中获取的。您可以在验证规则中使用unique来执行此操作。早期版本的Laravel(5.2之前版本)也使用了service进行注册,但这似乎已被放弃,以便在应用程序的默认身份验证流程中进行更简单的控制器设置。

我说检查请求的原因是因为控制器不应该关心数据是否有效。它所关心的只是将数据交给应用程序代码来完成工作,或者交给要显示的视图。但是,请求确实关心其中的数据,并且是执行此验证的最佳位置。这假设您实际上想要唯一的用户名。

您应该使用用户名进行的唯一卫生设施取决于您使用它的方式。对于数据库,模型使用下面的查询构建器(使用PDO),因此应正确转义值。如果您打算将这些字符用作url slugs或参数,则可以强制执行特定字符(或者某些字符不被使用)。在这种情况下,您可以在javascript中验证它们以及您为此特定请求创建的Request类。

最后,如果你想要的话,控制器看起来很好。您可能希望之后将它们重定向到登录页面,或者在注册后立即将它们登录,然后将它们重定向到他们应该看到的任何页面。这完全取决于您希望用户在创建帐户时完成的过程。