2015-01-19 5 views
0

Я занимаюсь авторизацией собственного пользователя и предоставляю роли пользователей на основе записи базы данных для моего users.Laravel 4.2 Безопасность роли пользователя

Я сделал две роли; a user роль, которая является всего лишь общим, зарегистрированным пользователем и ролью author, что, очевидно, для автора.

В моей миграции таблицы пользователей я использую $table->string('role')->default('user'); в качестве роли пользователя по умолчанию. Затем я могу решить из формы, если пользователь должен быть автором.

В моей User.php я создал public function, вызывающую запись базы данных роли в моей таблице пользователей, как так:

public function isAuthor() 
{ 
    if (Auth::guest()) return false; 
    return Auth::user()->role = $this->role == 'author'; 
} 

Что я теперь могу назвать в своих шаблонах, например, так:

@if($user->isAuthor()) 
    <p>Only the author can this!</p> 
@endif 

Это дает мне контроль, которого я ожидаю, но я не полностью продаюсь по факту «все так просто». Я понимаю, что да, я могу создать отношения с пользователем и привязать отношения между двумя моделями, но я нашел это довольно аккуратным. Мое единственное беспокойство в этом - безопасность.

Это может быть не лучшая практика, но я довольно новичок в Laravel и задаюсь вопросом, какие последствия для безопасности делают это так, как я сделал, и другие доступные методы.

Я полностью понимаю, что существуют другие методы в SO/Laravel. Документы и роли пользователей были темой многих дискуссий, хотя я никогда не видел ее так, как я ее реализовал (что меня беспокоит). Я только заметил, что я могу проверить, что текущий пользователь подписал этот метод с использованием вышеописанного метода и подумал, что запрос к базе данных для согласованной строки будет работать одинаково - и это так.

Мой вопрос: безопасен ли он для использования в реальном мире?

ответ

2

Похоже, вы просто используете поле varchar в своей базе данных и жестко кодируете свои разрешения вокруг него. Я предлагаю лучшую структуру.

table: users 
columns: id:int, role_id:int username:varchar64 password:varchar64 etc 

table: roles 
columns id:int, name:varchar64, description:varchar64 etc etc... 

table: permissions 
columns: id:int, name:varchar64 

table:roles_permissions 
columns: role_id:int, permission_id:int 

Здесь мы имеем четыре таблицы для пользователей, ролей пользователей, прав доступа и таблицы присоединиться шарнирной для многих ко многим отношений между ролями и разрешениями. Это основа для любой RBPS (система разрешений на основе ролей).

Каждый user может иметь одинrole

role может иметь или многиеpermissions

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

Все права доступа будут сохранены следующим образом: id:1, name:can_login

Если can_login соотношение присутствует на user роль «s присутствует, он может войти в систему. Какой-то макет кода.

if(Auth::can('can_login')) 
{ 
    //Log me in etc etc 
} 

Преимущество использования базы данных является то, что мы не повторяйте себе с логикой разрешения, которая является принцип дизайна в его собственной личности.

Этот тип функциональности был предоставлен снова и снова, и я предлагаю вам взглянуть на Entrust и Confide для Laravel, поскольку они обеспечивают все это из коробки для вас.

С другой стороны, если вы делаете это, чтобы учиться, продолжайте!

+0

Пригвожден. Фантастический ответ! Я все для повторного использования/масштабируемости, поэтому я бы скорее научился более эффективному подходу, так как я тогда не ограничен, как вы говорите, пользователям/ролям, которые имеют много отношений. Я сделаю шаг назад и изучу моделирование отношений, поскольку Laravel, похоже, справляется с этим как красота. Так яснее, я видел его в черно-белом цвете. Ура! –

+0

Вы очень приветствуетесь, сэр, есть много статей в Интернете, если вы застряли. Отъезд Laracasts (премиум) и скотч io – Everon

Смежные вопросы