7

나는 PHP와 MySQL을 사용하여 웹 응용 프로그램을 만드는 팀의 일원입니다. 응용 프로그램에는 역할이 다른 여러 사용자가 있습니다. 응용 프로그램은 또한 지리적으로 분산 된 방식으로 사용됩니다. 따라서 우리는 다음과 같은 두 가지 수준에서 작동하는 액세스 제어 시스템을 만들 필요가 : 특정 PHP 페이지에 대한PHP 액세스 제어 시스템

  1. 제어 사용자 권한 즉 제공하거나 사용자의 역할에 따라 특정 페이지 (또는 사용자 인터페이스 요소)에 대한 액세스를 거부합니다. 예를 들어 사용자는 '학생'페이지에 액세스 할 수 있지만 '교사'페이지에는 액세스 할 수 없습니다.
  2. 특정 데이터베이스 레코드에 대한 사용자 권한을 제어합니다. 즉, 특정 레코드 만 표시되도록 데이터베이스 쿼리를 수정합니다. 예를 들어, 도시 수준의 사용자의 경우 사용자의 특정 도시와 관련된 레코드 만 표시되고 국가 수준의 사용자는 해당 국가의 모든 도시 레코드를 표시해야합니다.

이러한 두 가지 유형의 액세스 제어를 모두 처리 할 수있는 시스템을 설계하는 데 도움이 필요합니다. 포인트 번호. 1 충분히 간단하게 보인다. 그러나 나는 SQL 쿼리에서 정보를 하드 코딩하지 않고서 포인트 번호 2를 수행하는 방법을 완전히 망각했다.

도움을 주시면 감사하겠습니다. 사전

Vinayak

답변

12

몇 달 전에 비슷한 상황이었습니다. 나는 Zend_ACL과 같은 도구가 단일 항목 (또는 합리적으로 적은 수)에 대한 액세스 수준을 확인하면 훌륭하게 작동한다는 것을 알게되었습니다. 사용자가 액세스 할 수있는 항목의 거대한 목록을 가져와야 할 때 실패합니다. Business Delegate 패턴을 사용하여이 문제에 대한 맞춤 솔루션을 만들었습니다. BD는 특정 상황에서 적용될 수있는 비즈니스 로직을 제공합니다.이 시나리오에서는 SQL 로직이 전달되어 subselect에서 필터링 조건으로 사용됩니다.

alt text http://gruz.epsi.pl/g/uml/permissions-s2.png

I blogged about this solution는, 불행하게도 폴란드어로 전부,하지만 당신은 코드와도 편리한의 조각을 찾을 수 있습니다 : 호출을 보여

alt text http://gruz.epsi.pl/g/uml/permissions.png

그리고 시퀀스 다이어그램 주문 : 다음 그림을 참조하십시오. 내가 말할 수있는 것, 구현은 케이크 조각이 아니지만 성능면에서 볼 때 목록의 각 요소에 대한 반복 액세스 검사와 비교할 때 챔피언입니다. 또한 위의 인프라는 목록에있는 항목 중 하나의 유형을 처리 할뿐만 아니라 목록에있는 항목이 IAuthorizable 인터페이스를 구현하는 한 도시, 국가, 제품 또는 문서 목록 일 때 다른 목록에 액세스 할 때 사용할 수 있습니다.

+0

안녕하세요, 저는 이전 답변을 알고 있지만, [UML 클래스 다이어그램] (http://en.wikipedia.org/wiki/Class_diagram)에 대한 설명이 필요합니다. 화살표의 종류에 따라 다른 의미가 있습니까? 단색, 점선 및 회색) – Triztian

+1

@Triztian - 화살표가있는 단색은 메소드 호출이고, 점선으로 표시된 수직선은 라이프 라인을 나타내고 점선은 점선으로 표시됩니다. –

1

에서

감사는 문제의 자세한하지만 젠드 프레임 워크는 당신이보고 할 수 있습니다 구성 요소가 아니라 강력한 ACLAUTH 세트가에 대해 알고하지 마십시오. 아주 정확한 액세스 제어, 지속성을위한 데이터 저장, 고급 조건부 규칙과 같은 좋은 것들. 그것은 당신이 필요 같은 날 것으로 보인다

1

은 이것이다 :

  1. 모든 국가의 목록 (I는 국가/국가/도시 예를 사용합니다). 각 "국가"에는 ID가 있습니다.
  2. 국가 내의 모든 국가의 목록입니다. 각 주 (State)는 각주의 ID에 바인딩되어 있지만 고유 ID도 가지고 있습니다.
  3. 모든 도시의 목록입니다. 각 도시는 주 또는 국가에 구속되며, 어느 도시를 나타내는 지 플래그가 있습니다.

도시 사용자의 경우, 해당 도시와 관련된 기록만을 검색하여 표시 할 수 있습니다. 주나 국가 수준의 경우 해당 국가 (또는 주 또는 당신이 가진 것)와 일치하는 ID가있는 각 도시의 모든 기록을 검색하십시오.

기본적으로 각 하위 그룹은 그 위의 그룹에 종속되어 있습니다. 올바르게 리콜하지는 않지만 하위 쿼리를 사용하여 거기에서 트릭을 수행 할 수 있다고 생각합니다.

+0

안녕 하지만 이것은 사용자의 각 레벨마다 검색 쿼리를 다르게 작성해야한다는 것을 의미합니다. 내 문제는 동일한 쿼리가 사용자 수준에 따라 다른 결과 집합을 반환하도록하는 방법을 찾는 것입니다. – Vinayak

+0

@ vinayak.myopenid.com, SQL 서버가 가지고있는 액세스 레벨을 알 수있게하려면 어쨌든 다른 쿼리를 사용해야합니다. 그것은 WHERE 절의 식을 AND로 처리하여 사용 권한을 처리하는 것처럼 보입니다. 꽤 간단하게 들립니다. – strager

0

당신이 이것을하는 방법을 모른다면 젠드 프레임 워크, CakePHP 또는 심포니와 같은 PHP 프레임 워크를 사용할 것입니다. 그들은 당신을 위해 무거운 짐을 싣고 이미 액세스 제어 체계의 일부 유형을 가지고 있습니다.

0

나는 비슷한 솔루션을 가지고 있으며, 지금까지는 사양과 역할을 사용하기로 결정했기 때문에 실제로 한 가지 역할에는 몇 가지 권한 사양이 첨부되어있었습니다. 모두 만족하면 권한이 부여되고 그렇지 않으면 리소스 기본 액세스로 돌아갑니다.

이미 솔루션을 구현 한 사람을 찾으려고했지만 아무도 보이지 않았습니다.