2015-01-19 4 views
0

난 내 users에 대한 데이터베이스 항목을 기반으로 사용자 권한을 부여하고 사용자 역할을 제공하고 있습니다.Laravel 4.2 사용자 역할 보안

저는 두 가지 역할을했습니다. 단지 일반적이고, 등록 된 사용자 인 user 역할과 저자 인 분명히 author 역할입니다.

내 사용자 테이블 이전에서는 $table->string('role')->default('user');을 기본 사용자 역할로 사용하고 있습니다. 그런 다음 사용자가 작성자 여야한다면 어딘가에 양식을 결정할 수 있습니다. 내 User.php에서

, 나는 내 사용자 테이블의 역할 데이터베이스 항목을 호출 그래서 같은 public function을 설정 :

@if($user->isAuthor()) 
    <p>Only the author can this!</p> 
@endif 
: 지금, 내 템플릿에 호출과 같이 할 수

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

이것은 내가 기대하는 컨트롤을 제공하지만 '쉽지 않다'라는 사실을 전적으로 팔리지는 않습니다. 나는 그렇다, 나는 사용자와 관계를 만들고 두 모델 간의 관계를 묶을 수 있다는 것을 이해한다. 그러나 나는이 것을 아주 깔끔하게 발견했다. 이것에 대한 유일한 걱정은 보안입니다.

이것은 장시간 연습으로는 좋지 않을 수도 있지만 Laravel을 처음 접했을 때 내가 한 방식과 다른 방법을 사용하는 것과 관련된 보안상의 의의가 궁금합니다.

SO/Laravel Docs에 대한 다른 방법이 있고 사용자 역할이 많은 토론의 주제 였음을 완전히 이해하고 있지만 구현 방법 (본인을 염려스럽게 여기는)을 본 적이 없습니다. 나는 현재 사용자가 위의 메소드를 사용하여 로그인했는지 확인할 수 있었고 일치하는 문자열에 대해 DB를 쿼리하면 동일하게 작동 할 것이라고 생각했습니다.

내 질문은 현실 세계에서 사용하기에 충분합니까?

답변

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 우리는 사용자가 많은 역할을해야 할 경우에도 반복 역할을 재사용하거나 수있는이 개념에 의해 0 또는 많은permissions

을 가질 수있을 수 있습니다 여분의 조인 테이블이 적용 가능합니다.

모든 권한

은과 같이 저장됩니다 다음 can_login 관계의 역할이 존재하는 user, 그는 로그인 할 수 있습니다에 존재 id:1, name:can_login

합니다. 어떤 모의 코드.

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

데이터베이스를 사용하는 이점은 우리가 자체의의 설계 원칙 인 권한 논리를 스스로를 반복하지 않는 것입니다.

이러한 유형의 기능이 여러 번 제공되었으며, Entrust 및 Confide for Laravel에서이 모든 기능을 제공합니다.

다른 한편으로는 배우기 위해 이것을하고 있다면 계속하십시오!

+0

Nailed it. 환상적인 대답! 나는 모두 재사용/확장성에 대한 것이므로 오히려 많은 관계가있는 사용자/역할에 제한되지 않기 때문에보다 나은 접근 방법을 배우게됩니다. 나는 Laravel이 이것을 아름다움처럼 다루는 것으로 보아 한발 물러서서 관계 모델링을 배울 것입니다. 이제는 훨씬 더 선명하게 흑백으로 보았습니다. 건배! –

+0

대단히 환영합니다. 막히면 많은 기사가 온라인에 있습니다. Laracasts (프리미엄)와 scotch io를 확인하십시오. – Everon