2014-11-24 9 views
2

저는 대학을 위해 역할 기반 액세스 제어가 필요한 PHP 응용 프로그램을 작성했습니다. 따라 한 접근법은 각 역할에 대해 별도의 MySQL 사용자를 만드는 것입니다. 그래서 모든 역할에는 별도의 db 사용자가있었습니다. 이 db 사용자 각각은 역할에 필요한 최소한의 테이블 세트에 대한 특권을가집니다.PHP 응용 프로그램에서 역할 기반 액세스 제어 구현

자, 내 질문은 이것이 실제로 역할 기반 응용 프로그램을 처리하는 적절한 방법인지 여부입니다. 내가이 의심에 빠진 이유는 지금 (GoDaddy 호스팅을 통해) 시스템을 온라인으로 가져올 때 테이블 특유의 권한을 가진 사용자를 만들 수 없다는 것을 알았 기 때문입니다. 실제로 그들은 SQL 스크립트 (사용자가 SQL 명령을 실행하는 PHP 스크립트를 통해 사용자를 생성하는 것과 관련된 시스템상의 역할 생성)를 통해 직접 사용자를 생성하는 것을 허용하지 않습니다.

내 접근 방식이 올바른 접근 방식인지 아닌지 지금 생각하고 있습니다. 그러한 역할 기반 시스템을 구현하는 표준 방법은 무엇입니까?

이것은 실제 프로젝트를 실제로 제공하는 데 많은 경험이 없었기 때문에 처음으로 라이브 프로젝트였습니다.

답변

3

hoster가 아니라면 스크립트를 통해 데이터베이스 사용자를 동적으로 생성하고 싶지 않을 것입니다. 그것에 대해 생각하십시오 :

데이터베이스 사용자는 최종 사용자가 아니라 응용 프로그램과 상호 작용하는 구성 요소입니다.

애플리케이션에 하나의 데이터베이스를 사용하고 전용 테이블을 사용하여 ACL을 만드십시오. 데이터베이스 스키마는 다음과 같이 수 :

  • 사용자 : 특별한 아무것도

    users(id:pk, name) 
    roles(id:pk, name) 
    permissions(id:pk, key, description) 
    permission_role(permission_id:fk, role_id:fk) 
    role_user(role_id:fk, user_id:fk) 
    

    당신은 기본적으로 여기에 세 가지가 있습니다. ID로 고유하게 정의 할 수있는 사용자입니다.

  • 권한 : : 기본적으로 스크립트에서 권한을 확인하기 위해 쿼리되는 키 저장소입니다.
  • 역할 : 사용자와 권한 사이에 접착제 사이. 사용자가 속한 역할과 권한의 합은 사용자가 수행 할 수있는 작업과 수행 할 수없는 작업을 모두 정의합니다.

기본 설정입니다. 다른 테이블은 조각을 함께 결합하는 도우미 테이블입니다.

코드가 나머지 부분을 처리합니다. 무거운 짐을하는 (또는 더 나은) 클래스를 설치하십시오. 그런 다음 ACL의 인스턴스를 User 클래스에 전달하십시오 (물론 다른 구현도 가능합니다. 게시물 하단 참조).

<?php 

class Acl implements AclInterface { 

    public function hasPermissionTo($action) 
    { 
     // Query DB and check if a record exists 
     // in the role_user table where the 
     // user_id matches with the current user 
     // and join the role_id with `roles` and then 
     // with `permission_role` to see if the user 
     // is permitted to perform a certain action 
    } 

} 

class User { 

    protected $acl; 

    public function __construct(AclInterface $acl) 
    { 
     $this->acl = $acl; 
    } 

    public function hasPermissionTo($action) 
    { 
     return $this->acl->hasPermissionTo($action); 
    } 

} 

기본 개념을 알아야합니다. 실제 구현은 귀하에게 달려 있습니다. 고려해야 할 사항 :

  • ACL을 User 또는 독립형 구성 요소에 포함 하시겠습니까?
  • 어떻게 현재 사용자를 ACL에 전달 하시겠습니까? 현재 사용자의 인스턴스를 ACL에 전달 하시겠습니까 아니면 사용자 ID 만 전달 하시겠습니까?

이러한 질문은 사용자가 원하는 것과 아키텍처에 따라 다릅니다. 해피 코딩!

+0

감사합니다. 사실 나는 응용 프로그램과 데이터베이스에 비슷한 배열이 있습니다. 하지만, 나중에 완전히 다른 역할을 맡은 사용자가 내 문제를 해결할 것이라고 생각하지 않았습니다 .-/ – kusa4indigeek

+0

모든 액세스마다 db 호출이 관련되어 있습니다. 성능 문제는 아닌가? –

+1

@nationbest 요청 당 한 번씩 모든 acl 관련 데이터를 가져 와서이 문제를 극복하기 위해 Acl 객체에 저장하는 것이 좋습니다 – thpl