Обработка входа в Sentry 2

У меня возникли проблемы с пониманием реализации Sentry 2 для входа в систему. Я имею в виду, что в Sentry это было довольно прямолинейно. Укажите имя пользователя / адрес электронной почты и пароль от метода ввода до Sentry::login(), однако они изменили его сейчас, и это действительно сбивает с толку.

Во-первых, они удалили столбец имени пользователя, что не имеет смысла.
Во-вторых, метод входа в систему теперь принимает объект пользователя, который вам нужно получить, используя идентификатор пользователя, что опять же не имеет смысла, поскольку вы не знаете идентификатор пользователя, если вы не сделаете другой запрос, поэтому они действительно все усложнили.

Мой код:

public function login()
{
    // Deny access to already logged-in user
    if(!Sentry::check())
    {
        $rules = array(
            'username' => 'required|unique:users',
            'password' => 'required' );

        $validator = Validator::make(Input::all(), $rules);

        if($validator->fails())
        {
            Session::flash('error', $validator->errors());
            return Redirect::to('/');
        }

        $fetch = User::where('username', '=', trim(Input::get('username')));
        $user = Sentry::getUserProvider()->findById($fetch->id);

        if(!Sentry::login($user, false))
        {
            Session::flash('error', 'Wrong Username or Password !');
        }

        return Redirect::to('/');

    }

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

Я пытался использовать этот подход, но он выдает исключение: этот идентификатор неизвестен, несмотря на то, что идентификатор является частью таблицы, а модель пользователя представляет собой не что иное, как объявление класса с $table = 'users'; атрибут.

Что я здесь делаю не так или не понимаю.


person Sterling Duchess    schedule 31.05.2013    source источник
comment
Не лучше ли использовать Sentry::authenticate()? И с фильтрами. Подобно AuthController в этом руководстве: codeforest.net/laravel-4-tutorial-part- 2   -  person Afzal N    schedule 31.05.2013


Ответы (3)


Код ниже — это мой метод входа в систему с использованием Sentry 2. По сути, я позволяю Sentry делать все для моей проверки, находить пользователя и, конечно же, входить в него. Сообщения на португальском языке, но если вам нужно, чтобы я перевел, просто скажите.

public function login()
{
    try
    {
        $credentials = array(
            'email'    => Input::has('email') ? Input::get('email') : null,
            'password' => Input::has('password') ? Input::get('password') : null,
        );

        // Log the user in
        $user = Sentry::authenticate($credentials, Input::has('remember_me') and Input::get('remember_me') == 'checked');

        return View::make('site.common.message')
            ->with('title','Seja bem-vindo!')
            ->with('message','Você efetuou login com sucesso em nossa loja.');

    }
    catch (Cartalyst\Sentry\Users\LoginRequiredException $e)
    {
        return View::make('site.common.message')
            ->with('title','Erro')
            ->with('message','O campo do e-mail é necessário.');
    }
    catch (Cartalyst\Sentry\Users\PasswordRequiredException $e)
    {
        return View::make('site.common.message')
            ->with('title','Erro')
            ->with('message','O campo do senha é necessário.');
    }
    catch (Cartalyst\Sentry\Users\UserNotActivatedException $e)
    {
        $user = Sentry::getUserProvider()->findByLogin(Input::get('email'));

        Email::queue($user, 'site.users.emailActivation', 'Ativação da sua conta na Vevey');

        return View::make('site.common.message')
            ->with('title','Usuário não ativado')
            ->with('message',"O seu usuário ainda não foi ativado na nossa loja. Um novo e-mail de ativação foi enviado para $user->email, por favor verifique a sua caixa postal e clique no link que enviamos na mensagem. Verifique também se os nossos e-mails não estão indo direto para a sua caixa de SPAM.");
    }
    catch (Cartalyst\Sentry\Users\WrongPasswordException $e)
    {
        return View::make('site.common.message')
            ->with('title','Erro')
            ->with('message','A senha fornecida para este e-mail é inválida.');
    }       
    catch (Cartalyst\Sentry\Users\UserNotFoundException $e)
    {
        return View::make('site.common.message')
            ->with('title','Erro')
            ->with('message','Não existe usuário cadastrado com este e-mail em nossa loja.');
    }

    // Following is only needed if throttle is enabled
    catch (Cartalyst\Sentry\Throttling\UserSuspendedException $e)
    {
        $time = $throttle->getSuspensionTime();

        return View::make('site.common.message')
            ->with('title','Erro')
            ->with('message',"Este usário está suspenso por [$time] minutes. Aguarde e tente novamente mais tarde.");
    }
    catch (Cartalyst\Sentry\Throttling\UserBannedException $e)
    {
        return View::make('site.common.message')
            ->with('title','Erro')
            ->with('message',"Este usário está banido do nossa loja.");
    }

}
person Antonio Carlos Ribeiro    schedule 31.05.2013
comment
Снова ты! О, вы должны создать блог или что-то о Sentry, ваши примеры потрясающие! - person giannis christofakis; 26.07.2013
comment
Это выглядит великолепно. Ничего, если я спрошу, как выглядит ваш postRegister и postPasswordreset? У меня такое чувство, что твой лучше. - person enchance; 20.08.2013
comment
в чем разница между аутентификацией() и логином()? - person Juan; 08.07.2014
comment
Authenticate() работает с учетными данными. Login() работает с объектом пользователя;) - person TeChn4K; 25.11.2014
comment
кроме того, Input::get('email', null) дает null по умолчанию - person Mei Gwilym; 26.03.2015

Я хотел бы поделиться своим мнением о маршрутах Sentry 2 Auth. Это то, что я использую сейчас во всех своих проектах. Класс Alert взят из этого пакета, который я недавно нашел. Я использую, чтобы передать его в MessageBag, но мне нравится, насколько это чисто.

class AuthController extends BaseController {

    public function login()
    {
        try
        {
            // Set login credentials
            $credentials = array(
                'email'    => Input::get('email') ?: null,
                'password' => Input::get('password') ?: null
            );

            // Authenticate our user and log them in
            $user = Sentry::authenticate($credentials, Input::get('remember_me') ?: false);

            // Tell them what a great job they did logging in.
            Alert::success(trans('success/authorize.login.successful'))->flash();

            // Send them where they wanted to go
            return Redirect::intended('/');

        }
        catch (Cartalyst\Sentry\Users\LoginRequiredException $e)
        {
            Alert::error(trans('errors/authorize.login.required'))->flash();
        }
        catch (Cartalyst\Sentry\Users\PasswordRequiredException $e)
        {
            Alert::error(trans('errors/authorize.login.password.required'))->flash();
        }
        catch (Cartalyst\Sentry\Users\WrongPasswordException $e)
        {
            Alert::error(trans('errors/authorize.login.password.wrong'))->flash();
        }
        catch (Cartalyst\Sentry\Users\UserNotFoundException $e)
        {
            Alert::error(trans('errors/authorize.login.user.found'))->flash();
        }
        catch (Cartalyst\Sentry\Users\UserNotActivatedException $e)
        {
            Alert::error(trans('errors/authorize.login.user.activated'))->flash();
        }
        // The following is only required if throttle is enabled
        catch (Cartalyst\Sentry\Throttling\UserSuspendedException $e)
        {
            Alert::error(trans('errors/authorize.login.user.suspended'))->flash();
        }
        catch (Cartalyst\Sentry\Throttling\UserBannedException $e)
        {
            Alert::error(trans('errors/authorize.login.user.banned'))->flash();
        }

        return Redirect::back()->withInput(Input::except('password'));
    }

    public function logout()
    {
        Sentry::logout();

        Alert::success(trans('success/authorize.logout.successful'))->flash();

        return Redirect::to('/');
    }
}
person gerobk    schedule 20.10.2013

Вам нужно вызвать конструктор родительского класса, чтобы наследовать его функциональность. В этом случае конструктор MainController не вызывается, и проверка завершается неудачно.

person mimi    schedule 17.04.2014