如何在Laravel 4中使用Sentry 2

时间:2014-01-08 11:50:08

标签: php laravel laravel-4 cartalyst-sentry

我的laravel4应用程序中有一个Personcontroller和一个Festivalcontroller。这些控制器中的操作只能由管理员访问。

如果我的数据库只有一个用户使用test@hotmail.com,那么该用户可以访问这两个控制器的路由。如果我的数据库没有用户test@hotmail.com,但它有其他用户,那么其他用户无法访问这两个控制器的路由。当我的数据库有一个用户test@hotmail.com,并且有其他用户时,每个人都可以访问这两个控制器的路由。

我只希望用户使用电子邮件test@hotmail.com访问这些控制器的路由。

我通过这样做安装了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'       => 'test@hotmail.com',
            'password'    => "test",
            'activated'   => 1,
        ));

        $user  = Sentry::getUserProvider()->findByLogin('test@hotmail.com');
        $adminGroup = Sentry::getGroupProvider()->findByName('Test');
        $user->addGroup($adminGroup);
    }
}

在我的PersonController中

class PersonController extends BaseController {

    public function index()
    {
        try
        {
            $user = Sentry::findUserByLogin('test@hotmail.com');

            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);
        }
    }

1 个答案:

答案 0 :(得分:4)

看起来您需要使用自己的用户表并使用Sentry。因此,您需要将相关的Sentry列添加到您的列中。这很简单:

1)转到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 migrate'。

之后,您应该准备好Sentry的表格。

修改

由于您没有使用通常的“电子邮件”和“密码”列,请发布Sentry的配置:

php artisan config:publish cartalyst/sentry

并改变

'login_attribute' => 'user_email',