2015-01-16 6 views
0

나는 다중 사용자 코드를 작성하고있다. 예를 들어 관리자와 사용자 등 다른 수준의 액세스 권한이 있어야합니다. 관리자는 일반 사용자보다 많은 권한을 가지며 반대의 경우도 마찬가지입니다. Codeigniter를 프레임 워크로 사용하지만 다음 프로젝트의 Laravel 프레임 워크로 이동. 내가 예를 들어, 기능, 분명히PHP 프레임 워크에서 함수 호출 보안 방법 Codeigniter, Laravel

function editSomething() 
{ 
    $book_id = new Book(); 
    $id = $this->input-post('id'); 
    // and then simply, 
    if($book->where('id', $id)->update($data)) 
} 

이있는 경우 지금 (사용자) ID를 보내고 POST입니다 에 대한 유효성 검사가 없습니다. http://localhost/?foo=bar과 컨트롤러가 실행될 수 있습니다.

이러한 환경에서 권한없는 액세스로부터 어떻게 내 기능을 보호 할 수 있는지 이해하려고 노력하고 있습니다. 프레임 워크는 어떤 보호 또는 지침을 제공합니까? 그렇다면 내 소유주를 확인하는 것이 내 논리 일 것입니다. 항목을 선택하고 그에 따라 업데이트하십시오. 이것은 db의 모든 레코드에 대해 owner_id (또는 뭔가)를 저장하여 레코드의 소유자를 식별해야 함을 의미합니까?

여기에 개념을 이해하는 데 어려움을 겪고 있습니다. 따라서 어떤 지침도 인정 될 것입니다.

감사합니다.

+0

laravel 가장 좋은 방법은 일부 권한 그룹에 대해서만 middelware를 추가하는 것입니다. –

답변

1

각 테이블에 소유자의 ID를 추가하는 것 외에 다르게 수행되고 있습니까? 나는 이것이 프레임 워크 특유의 것이 아니라 일반적으로 이해할 수있는 개념이라고 생각한다.

나는 이것이 다른 엔티티와 그 뒷받침 테이블에 사용자와 테이블의 관계에 크게 의존한다고 생각합니다. 어떤 경우에는 테이블에 user_id를 추가하여 소유권을 나타낼 수 있습니다. 그러나 제한적일 수 있습니다 ... 실제 데이터베이스 기반 엔터티가 아닌 컨트롤러 또는 작업과 같은 항목을 보호하려면 어떻게해야합니까?

Basic ACL Schema

이 스키마가 나던로 아주 기본적인 것입니다 : 당신이 강력한 무언가를 찾고 있다면 나는 많은 그가 자원 테이블을 떠났다는 사실을 제외하고 @bencohenbaritone 같은 일반적인 ACL 테이블 세트를 사용하는 것이 좋습니다 중첩되거나 그룹화 된 역할을 허용하지만 아이디어를 제공합니다. 이제 이것에 기반하여 자원, 권한 및 사용자 또는 역할을 취하고 조작이 수행 될 수 있는지 여부를 평가하는 서비스를 작성할 가능성이 높습니다. 다음과 같이 보일 수 있습니다 :

$acl = $dic->getService('acl'); 
if ($acl->isAllowed($userOrRole, $resource, $perm)) { 
    // do stuff! 
} else { 
    throw new Exception('You do not have access to perform this operation.', 403); 
} 

이 필터는 요청 필터이거나 제어기 또는 다른 곳에서 구현할 수 있습니다. 이는 실제로 리소스 유형과 비즈니스 규칙에 따라 다릅니다.


일반적으로 ACL/RBAC 개념을이 문제에 적용합니다. 서로 다른 수준의 액세스로 보호해야하는 시스템의 요소는 리소스입니다. 그런 다음 사용자는 하나 이상의 역할을 갖게됩니다. 각 역할은 주어진 자원에 대한 권한 집합을 갖습니다.

이 정보를 저장하고 확인하는 방법은 다소 다르지만 기본적으로 기본 인증 및 기본 인증 (예 : 인증과 결합되는 경우가 있음)과 같은 기본 파일 시스템보다 프레임 워크에 기본적으로 포함되어 있지 않습니다.

ACL 라이브러리 구현의 예는 Zend Framework 및 Zend Framework 2를 참조하십시오.

당신은 자원을 만들고 싶다.

0

Laravel 인증 built in의이 종류를 가지고, 당신은이처럼 User 객체에 isAdmin() 같은 방법을 추가하고 그것을 사용하는 것 :

<?php 
function editSomething() 
{ 
    if (!Auth::user()->isAdmin()) 
     App::abort(403); 
    ... 

개념은 CodeIgniter의 유사 할 것이다. 나는 CodeIgniter의와 같은 익숙하지 해요,하지만 지금까지 내가 말할 수있는 아마 이와 같은 제 3 자 라이브러리를 필요 했어 : 그것은 당신이에 대한 액세스를 제어하는 ​​방법을 단단히에 따라

http://community-auth.com/

+0

아니요. 관리자가 아니거나 관리자가 아닙니다. 내 함수에 위의 논리를 적용하면 일반 사용자가 수정할 함수에 액세스 할 수 있다고 가정 해 봅시다. * * 자신의 콘텐츠,하지만 누군가가 ** POST ** 함수에 대한 다른 매개 변수를 단순히 결정하면 어떻게됩니까? 사용자가 게시하는 방법에 대해서는 논쟁하지 않지만 기능을 통해 게시 할 수 있습니다. – NBhatti

2

의지.

예를 들어 모든 게시물을 업데이트 할 수있는 한 그룹의 사용자를 원할 수 있지만 자신의 게시물 만 수정할 수있는 사용자가있을 수도 있습니다. 후자가 필요하면 자원 테이블에 소유자 열을 저장해야합니다. 이는 일반적으로 좋은 습관입니다. 액세스 제어에 사용하지 않더라도 누가 리소스를 생성했는지 감사 할 수 있어야합니다. 감사 테이블을 만들어 개체가 언제 수정되는지 추적 할 수도 있습니다.

사용자 테이블에서 사용자를 역할에 매핑 할 수 있습니다 (보다 정교한 시스템의 경우 users_roles 피봇을 별도로 생성). 그리고 나서 사용중인 모든 인증/로그인/세션 관리 시스템 (일반적으로 프레임 워크에서 제공됩니다.)에는 현재 사용자의 역할을 확인하는 메소드가 있어야합니다. 그런 다음 각 역할에 사용 권한을 할당 할 수 있습니다. 그런 다음 로그인 한 사용자는 보호 할 필요가 컨트롤러 작업에 올바른 사용 권한이 있는지 여부를 확인하는 조건을 추가 할 수 있습니다

|Users  |  |User_Role |     |Permissions | 
------------  --------------  |Roles | ---------------- 
|id  | ==== |user_id  |  ------- |id   | 
|...  |  |role_id  | ===== |id |===|role_id  | 
----------  ------------  |name | |resource  | 
             ------ |action  | 
                -------------- 

: 샘플 스키마는 뭔가처럼 될 수 있습니다.

Laravel을 포함한 일부 프레임 워크를 사용하면 경로 또는 컨트롤러에 필터를 적용 할 수 있습니다. 여기를 참조하십시오 : http://laravel.com/docs/4.2/routing#route-filters. 이렇게하면 동일한 인증 로직을 여러 컨트롤러 메소드에 복사하지 않아도됩니다.

+0

답변이 도움이됩니다. 하지만 가장 중요한 것은 리소스 소유자까지 드릴 다운하는 것입니다. 이 기능은 인증 (예를 들어)을 제공하고 관리자 또는 일반 사용자를 확인하지만 정상적인 사용자는 다른 사용자의 리소스를 CRUD 할 수 없어야합니다. 각 테이블에 소유자의 ID를 추가하는 것 외에 다르게 수행되고 있습니까? 나는 이것이 프레임 워크 특유의 것이 아니라 일반적으로 이해할 수있는 개념이라고 생각한다. – NBhatti

+0

"소유 한"자원이있는 각 테이블에 소유자 ID를 추가 할 수 있습니다. 또는 다 - 대 - 다 관계를 원할 경우 user_resource 피벗 테이블을 추가 할 수 있습니다. 이는보다 유연한 아키텍처입니다. 예를 들어 사용자가 각자의 자원을 소유 할 수 있지만 중재자가 자신의 섹션에있는 모든 자원을 소유 할 수 있으며 관리자가 모든 사람의 자원을 소유 할 수 있습니다. 응용 프로그램이 여러 사람이 "소유"한 자원을 가져야하는지 여부는 전적으로 사용자에게 달려 있습니다. 여러분의 옵션은'user - | ---- | | ---- | bthecohen

+1

소유권을 정의 할 때 더 많은 유연성을 제공 할 수있는 또 다른보다 복잡한 아키텍처는 사용자를 트리로 표현하는 것입니다. 각 사용자는 "수퍼바이저"또는 "마스터"계정 아이디를 가질 수 있습니다. 그런 다음 트리에있는 자손 또는 리소스의 자손 중 하나가 리소스를 소유하고 있으면 누군가가 리소스를 소유하고 있다고 말할 수 있습니다. 그러나 관계형 모델에서 트리를 유지 보수/쿼리하는 작업이 복잡하기 때문에 관리가 까다로울 수 있습니다. 대표에 대한 토론은 http://leopard.in.ua/2013/07/11/storing-trees-in-rdbms/ 및 http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/을 참조하십시오. RDBS의 나무. – bthecohen

0

인증을 위해 Ion Auth을 사용하고 전체 탐색, 하위 메뉴 등을 별도의 설정 파일에 넣습니다. 모양은 다음과 같습니다.

$config["nav"]["ajax_table/show_sport"] = 
    array(
     "permission" => "100", 
     "subnav" => "FALSE", 
     "label" => lang("show_sport"), 
     "location" => "c=ajax_table&m=show_sport", 
     "parent_id" => "ajax_table" 
    ); 

중요한 부분은 다음과 같습니다. 테이블«groups»을 permission이라는 컬럼으로 확장했습니다. 여기서 각 롤에 값을 입력했습니다. 예제에서 100은 일반 사용자, 1000은 관리자입니다. 그것 뿐이다

$this->navigation = $this->config->item("nav"); 
$role = $this->ion_auth_model->get_role(); 
if ($this->role < $this->navigation[$this->router->class . "/" . $this->router->method]["permission"]){ 
    redirect("your/url/here", "refresh"); 
} 

: 내 basecontroler에서

나는 모든 요청을 확인합니다.