Как использовать Sentry 2 в Laravel 4

У меня есть Personcontroller и Festivalcontroller в моем приложении laravel4. Действия в этих контроллерах могут быть доступны только администратору.

Если в моей базе данных есть только пользователь с [email protected], этот пользователь может получить доступ к маршрутам этих двух контроллеров. Если в моей базе данных нет пользователя с [email protected], но есть другие пользователи, эти другие пользователи не могут получить доступ к маршрутам этих двух контроллеров. И когда в моей базе данных есть пользователь с [email protected] и другие пользователи, каждый может получить доступ к маршрутам этих двух контроллеров.

Я хочу, чтобы пользователь с адресом электронной почты [email protected] имел доступ к маршрутам этих контроллеров.

Я установил Sentry2 следующим образом:

В файле composer.json требуется:

"cartalyst/sentry": "2.0.*"

Бежать

php composer.phar update

В приложении> config> app.php:

'Cartalyst\Sentry\SentryServiceProvider', => в массив провайдеров

'Sentry' => 'Cartalyst\Sentry\Facades\Laravel\Sentry', => в массив псевдонимов

После установки сделал файл SentrySeeder:

<?php

class SentrySeeder extends Seeder {

    public function run()
    {
        DB::table('users')->delete();
        DB::table('groups')->delete();
        DB::table('users_groups')->delete();

        Sentry::getUserProvider()->create(array(
            'email'       => '[email protected]',
            'password'    => "test",
            'activated'   => 1,
        ));

        $user  = Sentry::getUserProvider()->findByLogin('[email protected]');
        $adminGroup = Sentry::getGroupProvider()->findByName('Test');
        $user->addGroup($adminGroup);
    }
}

В моем PersonController

class PersonController extends BaseController {

    public function index()
    {
        try
        {
            $user = Sentry::findUserByLogin('[email protected]');

            if ($user)
            {
                $person = Person::with('user')->orderBy('person_id')->paginate(10);

                return View::make('persons.index')
                   ->with('person', $person);
            }
        }
        catch (Cartalyst\Sentry\Users\UserNotFoundException $e)
        {
            echo 'User was not found.';
        }

    }
}

Действие входа в LoginController

public function login()
{
    $input = Input::all();
    $rules = array(
        'user_email'    => 'required', 
        'user_password' => 'required'
    );

    $validator = Validator::make($input, $rules);

    if ($validator->fails()) {
        return Redirect::to('login')
            ->withErrors($validator) // send back all errors to the login form
            ->withInput(Input::except('user_password'));
    } 
    else {
        $attempt = Auth::attempt([
            'user_email'    => $input['user_email'],
            'password'  => $input['user_password']
        ]);

        if ($attempt) {
            return Redirect::to('/home');
         } 
        else {
            return Redirect::to('login');
        }

    }

Сохранить пользователя в базе данных

public function store()
    {
        $input = Input::all();

        $rules = array(
            'user_email'      => 'required|unique:users|email',
            'user_username'      => 'required|unique:users',
        );
        $validator = Validator::make($input, $rules);

        if($validator->passes())
        {
            $password = $input['user_password'];
            $password = Hash::make($password);

            $location = new Location();

            $person = new Person();

            $user = new User();

            $person->person_firstname = $input['person_firstname'];
            $person->person_surname = $input['person_surname'];

            $user->user_username = $input['user_username'];
            $user->user_email = $input['user_email'];
            $user->user_password = $password;

            $location->save();

            $person->save();
            $user->location()->associate($location);
            $user->person()->associate($person);

            $user->save();

            Session::flash('message', 'Successfully created user!');
            return Redirect::to('login');
        }
        else {
            return Redirect::to('persons/create')->withInput()->withErrors($validator);
        }
    }

person Gilko    schedule 08.01.2014    source источник
comment
В вашем коде сидера не был создан пользователь [email protected]. Как он мог найти этого конкретного пользователя?   -  person Antonio Carlos Ribeiro    schedule 08.01.2014
comment
Ну, я изменил существующий Sentry на электронную почту [email protected] и на test пароль, но это тоже не сработало. Я только учусь использовать Sentry2. У меня была моя существующая база данных, после установки Sentry2 я ничего не менял в базе данных, мне нужно добавить таблицу или что-то в этом роде?   -  person Gilko    schedule 08.01.2014
comment
Вы проверили свою базу данных, чтобы увидеть, существует ли какая-либо учетная запись с [email protected] или нет?   -  person aayush shrestha    schedule 08.01.2014
comment
Оба сообщения: «Пользователь не найден». Какое из них вы получаете?   -  person Antonio Carlos Ribeiro    schedule 08.01.2014
comment
У меня была моя существующая база данных. Вы понимаете, что sentry использует свои собственные таблицы базы данных для пользователей, не так ли??   -  person aayush shrestha    schedule 08.01.2014
comment
Да, у меня есть действие в моем PersonController, где я создаю и храню своих пользователей. Я проверил phpmyadmin, и пользователь с [email protected] находится в моей таблице пользователей моей базы данных.   -  person Gilko    schedule 08.01.2014
comment
Как сказал @aayushshrestha, вы казнили artisan migrate --package=cartalyst/sentry?   -  person Antonio Carlos Ribeiro    schedule 08.01.2014
comment
Он говорит [PDOException] SQLSTATE [42S01]: базовая таблица или представление уже существует: 1050 Таблица «пользователи» уже существует   -  person Gilko    schedule 08.01.2014
comment
В яблочко. Не используйте существующую таблицу пользователей. удалите это, а затем запустите миграцию Sentry.   -  person aayush shrestha    schedule 08.01.2014
comment
cartalyst.com/manual/sentry/installation/laravel-4#migrations Документ Sentry действительно полезен.   -  person aayush shrestha    schedule 08.01.2014
comment
Поэтому мне нужно добавить свои отношения в другие таблицы после запуска artisan migrate --package=cartalyst/sentry?   -  person Gilko    schedule 08.01.2014
comment
Да. Я бы предложил использовать user_id в качестве ключа для других таблиц, чтобы они относились к таблице пользователей или другой таблице отношений. Сказав это, нет ничего плохого в добавлении нового поля в таблицу.   -  person aayush shrestha    schedule 08.01.2014
comment
Кто-нибудь из вас, ребята, знает альтернативу, которая проще, если у вас уже есть существующая база данных?   -  person Gilko    schedule 08.01.2014


Ответы (1)


Похоже, вам нужно использовать свою собственную таблицу пользователей, а также использовать Sentry. Поэтому вам нужно будет добавить связанные столбцы Sentry к своим. Это просто:

1) Go to vendor\cartalyst\sentry\src\migrations.

2) Создайте одну новую миграцию для каждого файла, который вы там видите, например:

php artisan migrate:make add_sentry_groups_table

3) Скопируйте код up() и down() (ТОЛЬКО!) в свои новые миграции.

4) И для миграции пользователей вам придется внести некоторые изменения:

  • Вместо Schema::create('users' ... вы делаете Schema::table('users' ..., чтобы добавить в таблицу больше столбцов.

  • Удалите все команды для столбцов, которые у вас уже есть в вашей текущей таблице пользователей, примеры строк, которые вы должны удалить:

    $table->increments('id'); 
    $table->timestamps();
    

5) Запустите обычную «миграцию php artisan».

После этого у вас должны быть готовы столы Sentry к работе.

ИЗМЕНИТЬ

Поскольку вы не используете обычные столбцы «электронная почта» и «пароль», опубликуйте конфигурацию Sentry:

php artisan config:publish cartalyst/sentry

И изменить

'login_attribute' => 'user_email',
person Antonio Carlos Ribeiro    schedule 08.01.2014
comment
Эти вновь созданные миграции должны быть в приложениях › базе данных › миграции, верно? Могу ли я использовать те же имена, что и в папке vendor\cartalyst\sentry\src\migrations - person Gilko; 08.01.2014
comment
Да, но если вы используете php artisan migrate:make, они уже будут там размещены. - person Antonio Carlos Ribeiro; 08.01.2014
comment
миграция завершена, я также обновил свои SentrySeeder и PersonController. Я думаю, что я все еще что-то упускаю. Я все еще получаю, что пользователь не был найден. - person Gilko; 08.01.2014
comment
Вы видите этих пользователей в своей таблице? - person Antonio Carlos Ribeiro; 08.01.2014
comment
Да, я вижу [email protected] в своей таблице. Он находится в поле user_email, а поле user_password хешируется. - person Gilko; 08.01.2014
comment
Итак, я думаю, мне нужно изменить «электронную почту» и «пароль» в SentrySeeder на «user_email» и «user_password»? - person Gilko; 08.01.2014
comment
user_email? разве это не должно быть просто email? - person Antonio Carlos Ribeiro; 08.01.2014
comment
Ну, в моей существующей базе данных есть user_email.. Но Sentry, очевидно, будет использовать электронную почту. - person Gilko; 08.01.2014
comment
давайте продолжим это обсуждение в чате - person Antonio Carlos Ribeiro; 08.01.2014