Laravel 4.1通过电子邮件激活进行新用户注册

时间:2014-03-19 04:49:44

标签: email laravel-4 registration

请一些Laravel知识分子能指出我正确的方向。为了DRY的利益和使用Laravels非常棒的助手等,我想知道是否有人有解决方案: 对于注册新用户,我可以找到的所有示例和文档似乎都有一个要求提供电子邮件,用户名等的表单 验证(或不验证)输入并创建用户并将其添加到db。一些示例继续向新用户发送欢迎电子邮件。我有这个过程的问题,因为任何人都可以使用任何电子邮件地址注册,即使它不是他们的。因此,我希望在用户激活之前将电子邮件与激活链接合并以确保地址的所有权。

我是否遗漏了某些东西,或者Laravel是否有某种令牌生成功能可以帮助生成令牌和/或通过电子邮件发送给新用户?我有设置密码提醒,看到有一个很棒的方法:密码::提醒 它生成令牌等并向用户发送电子邮件,并想知道是否有这样的东西我可以用于激活电子邮件。

如果不是我能看到这种可能性的唯一方法是向db(token和user_activated)添加2个字段,然后在用户保存时在控制器中添加,以某种方式生成令牌并将其保存并将值保存到user_activated字段。然后发送一封电子邮件,其中包含指向控制器的链接,该控制器在单击时会检查令牌,匹配用户并更新user_activated字段并将用户登录等。

非常感谢

2 个答案:

答案 0 :(得分:6)

下面我留下旧版Laravel的旧答案,但是,对于laravel 5.2+,你只需:

php artisan make:auth

php artisan migrate

这是我写的用于通过电子邮件验证用户的包(包括重新发送确认和密码重置):

你可以在这里看到一个演示:

https://signup.edenwired.com/

此处提供的源代码:

https://github.com/iateadonut/signup/

当然,如果您要在自己的脚本中使用这些代码段而不是下载我的脚本,则应该删除对命名空间的引用iateadonut / signup /

这是登录表单(刀片模板);如果您已登录,它会为您提供注销链接;否则它会为您提供登录表单:

@if ( Auth::guest() )

<form method='POST' action="{{ URL::to('/login') }}">
<label class='loginLabel'>email: </label>
<input name='email' id='email'> <br />
<label class='loginLabel'>password: </label>
<input type='password' name='pword' id='pword'> <br />
<label class='loginLabel'><span class='labelHolder'>.</span></label>

<input type=checkbox> Remember Me 
<input type=submit value='Log In' name='remember'>
</form>

    @if ( isset( $loginMessage ) )
    <p>{{ $loginMessage }}</p>
    @endif

<label class='loginLabel'><span class='labelHolder'>.</span></label>
<a href='signup'>Sign up / Reset Password</a>

@else

You are logged in.  {{ HTML::link('logout', 'Log out.') }}

@endif

这是登录和注销的路由(/ meat是经过身份验证的用户将被重定向到的目录)。

如果用户未登录,则会将其带到网站root:

Route::filter('auth', function() {
    if (Auth::guest()) return Redirect::to('/');
});

如果用户进入'退出',首先我们检查他是否已登录;如果是这样,请将他退出;然后,无论哪种方式,将用户返回到网站根目录:

Route::get( 'logout', function(){
    if ( !Auth::guest() ) Auth::logout();
    return Redirect::to('/');
});

www.webroot.com/login的登录程序:

Route::get ('login', function()
{
    return Redirect::to('/');
});

这是从登录表单发布的内容。请注意,Auth :: attempt也接受参数Input :: get('remember') - 这是Laravel的内置函数,用于记住登录。如果登录失败,我们嵌套loginForm(上面)并给它一个错误消息:

Route::post( 'login', function()
{
    $credentials = array(
            'email'     => Input::get('email'),
            'password'  => Input::get('pword'),
            'id_code'   => '1'
    );

    if ( Auth::attempt($credentials, Input::get('remember')) )
    {
        return Redirect::to('/meat');
    } else {
        return View::make('signup::home')
            ->nest('loginForm', 'signup::loginForm')
            ->with('loginMessage', 'Invalid Login.');
    }

});

这是注册表格;项目中的那个包括密码恢复和重发确认电子邮件,但我们会忽略这个答案中的那些;也不包括javascript确认有效的电子邮件并检查两个密码是否相同。

在源代码中,还有一些连接到数据库的jquery,以确保用户想要的电子邮件地址尚未使用:

<div class='signupbox'>

    <form action='signup2' method='post'>

    your email address: <br>
    <div id='EMAIL' style='float:right;'></div><input type='text' name='email' id='email2'><br>

    password: <br>
    <div id='PW1' style='float:right;'></div><input type=password maxlength=20 name='pw' id='pw' ><br>

    confirm password: <br>
    <div id='PW3' style='float:right;'></div><input type=password maxlength=20 name='pw2' id='pw2' ><br>

    <input type='submit' value='create account' disabled=true id='createAccount' class='createAccount'></form>

    <p>Use this when signing up for a new account.</p>

</div>

以下是两条注册路线:

这只是将用户重定向到注册表单:

Route::get( 'signup', array( 'uses' => 'Iateadonut\Signup\SignupController@showSignup' ));

这个接受注册表格的帖子:

Route::post( 'signup2', array('uses' => 'Iateadonut\Signup\SignupController@signup2'));

注册控制器看起来像这样;首先它生成一个25个字符的随机字符串,然后将该电子邮件地址和散列密码输入数据库,然后向用户发送一封电子邮件,以便他确认电子邮件地址是他的:

public function signup2()
{

    //GENERATE $newcode - RANDOM STRING TO VERIFY SIGNUP
    for( $code_length = 25, $newcode = ''; strlen($newcode) < $code_length; $newcode .= chr(!rand(0, 2) ? rand(48, 57) : (!rand(0, 1) ? rand(65, 90) : rand(97, 122))));

    $user = new User;
    $user->email        = Input::get('email');
    $user->password     = Hash::make( Input::get('pw') );
    $user->id_code      = $newcode;
    $user->save();

    $data = array(
        'email'     => Input::get('email'),
        'clickUrl'  => URL::to('/') . '/confirm/' . $newcode
    );

    Mail::send('signup::emails.signup', $data, function($message)
    {
        $message->to( Input::get('email') )->subject('Welcome!');
    });

    return View::make('signup::signup2')->with($data);

}

电子邮件的视图必须包含已创建的id_code的链接(views / emails目录中的signup.blade.php):

Please click on:<br /><br />

{{ HTML::link( $clickUrl ) }} <br /><br />

to confirm your account.

当然,要把它放在数据库中,你需要一张桌子;以下是迁移的一些细节(字段pw_code用于密码恢复,本答案中未对此进行讨论):

    Schema::create('users', function(Blueprint $table)
    {
        $table->increments('id');

        $table->string('email', 100)->unique();
        $table->string('password', 64);
        $table->string('remember_token', 100);      
        $table->string('id_code')->default(0);
        $table->string('pw_code')->default(0);

        $table->timestamps();
    });

以下是确认电子邮件链接到的路线:

Route::get( 'confirm/{id_code}', array( 'uses' => 'Iateadonut\Signup\SignupController@confirm' ));

注册控制器中的函数confirm()如下所示:

public function confirm( $id_code )
{

    if ( $user_info = User::where('id_code', '=', $id_code)->first() )
    {

        $uid    = $user_info->id;
        $email  = $user_info->email;

        $data = array(
            'id_code'   => $id_code,
            'user_id'   => $uid,
            'email'     => $email
        );

        $user   = User::find($uid);
        $user->id_code = 1;
        $user->save();

        Auth::login( User::find($uid) );

        return View::make('signup::confirmed')->with($data);

    } else {

        return View::make('signup::confirmedError')->nest('loginForm', 'signup::loginForm');

    }

}

最后但并非最不重要的是,因为您正在发送密码,所以您肯定希望使用安全连接;确保你在filters.php中有这样的东西:

App::before(function($request)
{
    if( ! Request::secure())
    {
        return Redirect::secure(Request::path());
    }
});

我认为就是这样! Laravel让你很简单!

答案 1 :(得分:1)

是的,您可以自己构建或使用此示例包: cartalyst/sentry

他们内置了此功能。

修改

如果你仍然想要一个解决方案,请看这里:

https://github.com/BenBradleySmith/email-verification