Using the Remember me feature with Sentry in Laravel 4

蓝咒 提交于 2019-12-08 06:09:08

问题


I'm trying to get a login form to 'remember' the user logging in and I just can't work out how to do it.

Here's my controller

public function getLogin()
{
    // Return the view with the data
    return View::make('users.login');
}

public function postLogin() 
{
    // Gather Sanitized Input
    $input = array(
        'email'      => Binput::get('email'),
        'password'   => Binput::get('password'),
        'rememberMe' => Binput::get('rememberMe')
        );

    // Set Validation Rules
    $rules = array (
        'email'    => 'required|min:4|max:64|email',
        'password' => 'required|min:6'
        );

    //Run input validation
    $v = Validator::make($input, $rules);

    if ($v->fails())
    {
        // Validation has failed
        return Redirect::to('users/login')->withErrors($v)->withInput();
    }
    else 
    {
        try
        {
            //Check for suspension or banned status
            $user = Sentry::getUserProvider()->findByLogin($input['email']);
            $throttle = Sentry::getThrottleProvider()->findByUserId($user->id);
            $throttle->check();

            // Set login credentials
            $credentials = array(
                'email'    => $input['email'],
                'password' => $input['password']
            );

            // Try to authenticate the user
            $user = Sentry::authenticate($credentials, $input['rememberMe']);
            Sentry::loginAndRemember($user);

        }
        catch (Cartalyst\Sentry\Users\UserNotFoundException $e)
        {
            // Sometimes a user is found, however hashed credentials do
            // not match. Therefore a user technically doesn't exist
            // by those credentials. Check the error message returned
            // for more information.
            Session::flash('error', 'Invalid username or password.' );
            return Redirect::to('users/login')->withErrors($v)->withInput();
        }
        catch (Cartalyst\Sentry\Users\UserNotActivatedException $e)
        {
            echo 'User not activated.';
            Session::flash('error', 'You have not yet activated this account.');
            return Redirect::to('users/login')->withErrors($v)->withInput();
        }

        // The following is only required if throttle is enabled
        catch (Cartalyst\Sentry\Throttling\UserSuspendedException $e)
        {
            $time = $throttle->getSuspensionTime();
            Session::flash('error', "Your account has been suspended for $time minutes.");
            return Redirect::to('users/login')->withErrors($v)->withInput();
        }
        catch (Cartalyst\Sentry\Throttling\UserBannedException $e)
        {
            Session::flash('error', 'You have been banned.');
            return Redirect::to('users/login')->withErrors($v)->withInput();
        }

        return Redirect::to('/');
    }
}

/**
 * Logout
 */

public function getLogout() 
{
    Session::flush();
    Sentry::logout();
    return Redirect::to('/');
}

And here's my View

@extends('layouts/master')

{{-- Web site Title --}}
@section('title')

@stop

{{-- Content --}}
@section('content')
<div class="tck-well span6 offset3">
    <h1>Login</h1>
    <form class="" action="{{ URL::to('users/login') }}" method="post">   
        {{ Form::token(); }}

        <div class="control-group {{ ($errors->has('email')) ? 'error' : '' }}" for="email">
            <label class="control-label" for="email">E-mail</label>
            <div class="controls">
                <input name="email" id="email" value="{{ Request::old('email') }}" type="text" class="input-xlarge" placeholder="E-mail">
                {{ ($errors->has('email') ? $errors->first('email') : '') }}
            </div>
        </div>

       <div class="control-group {{ $errors->has('password') ? 'error' : '' }}" for="password">
            <label class="control-label" for="password">Password</label>
            <div class="controls">
                <input name="password" value="" type="password" class="input-xlarge" placeholder="New Password">
                {{ ($errors->has('password') ?  $errors->first('password') : '') }}
            </div>
        </div>

        <div class="control-group" for"rememberme">
            <div class="controls">
                <label class="checkbox inline">
                    <input type="checkbox" name="rememberMe" value="1"> Remember Me
                </label>
            </div>
        </div>

        <div class="form-actions">
            <input class="button button-large button-secondary" type="submit" value="Log In"> 
            <a href="/users/resetpassword" class="btn btn-link">Forgot Password?</a>
        </div>
  </form>
</div>

@stop

Can someone help point me in the right direction please?


回答1:


You could also use the helper method:

if( Input::get('rememberMe') ) {
    $user = Sentry::authenticateAndRemember($credentials)
} else {    
    $user = Sentry::authenticate($credentials, false);
}



回答2:


Similar to Devo's

// Try to log the user in
Sentry::authenticate(Input::only('email', 'password'), Input::get('remember-me', 0));

// For the view page
<input type="checkbox" name="remember-me" id="remember-me" value="1" /> Remember me;



回答3:


Instead of,

$user = Sentry::authenticate($credentials, $input['rememberMe']);

Use,

if(!empty($input['rememberMe'])) {
   $user = Sentry::authenticate($credentials, true);
} else {
   $user = Sentry::authenticate($credentials, false);
}

And make sure you are getting some value in $input['rememberMe'].




回答4:


From GitHub it seems setting gc_maxlifetime in php.ini (or .htaccess) is sometimes necessary as well..

session.gc_maxlifetime = 2592000



回答5:


In app/config/session.php add this lines:

'lifetime' => 999999,
'expire_on_close' => false,


来源:https://stackoverflow.com/questions/19111291/using-the-remember-me-feature-with-sentry-in-laravel-4

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!