programing

사용자 역할 및 권한 시스템 설계의 베스트 프랙티스

randomtip 2022. 9. 11. 17:03
반응형

사용자 역할 및 권한 시스템 설계의 베스트 프랙티스

PHP/MySQL을 사용하여 빌드된 웹 응용 프로그램에 사용자 역할과 권한 시스템을 추가해야 합니다.다음과 같은 기능을 원합니다.

  1. 1명의 루트 사용자는 서브루트, 그룹, 규칙 및 일반 사용자(모든 권한)를 작성할 수 있습니다.
  2. 서브루트는 자신의 그룹(그룹 없음)에 대한 규칙, 권한 및 사용자만 만들 수 있습니다.
  3. 사용자는 자신에게 할당된 권한에 따라 그룹 루트별로 사용자 또는 그룹에 의해 작성된 콘텐츠에 액세스할 수 있습니다.

컨텐츠에 새로운 역할과 권한을 할당할 수 있도록 시스템이 충분히 유연해야 합니다.

는 나나 a a a가 있다users테이블에는 다른 정보와 함께 그룹 키가 저장됩니다.현재 각 컨텐츠 테이블에서 두 개의 feeld를 사용하고 있습니다. createdBy ★★★★★★★★★★★★★★★★★」CreatedByGroup특정 사용자에게 권한이 있는지 여부를 포인트로 사용합니다.그러나 새로운 콘텐츠마다 모든 데이터 업데이트 및 권한 업데이트를 수행해야 하기 때문에 유연성이 부족합니다.스키마 설계의 베스트 프랙티스에 대해 상담해 주십시오.

사용자 권한을 구현하는 가장 좋은 방법은 비트 연산자라고 생각합니다.여기에서는 MySQL을 사용하여 구현하는 방법을 보여 줍니다.

샘플 데이터를 포함한 샘플테이블을 다음에 나타냅니다.

1: 1, 2, 4, 8과 같이 권한 이름을 저장하는 권한 테이블etc (2개 중 하나)

CREATE TABLE IF NOT EXISTS `permission` (
  `bit` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`bit`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

샘플 데이터를 테이블에 삽입합니다.

INSERT INTO `permission` (`bit`, `name`) VALUES
(1, 'User-Add'),
(2, 'User-Edit'),
(4, 'User-Delete'),
(8, 'User-View'),
(16, 'Blog-Add'),
(32, 'Blog-Edit'),
(64, 'Blog-Delete'),
(128, 'Blog-View');

2: 사용자 ID, 이름 및 역할을 저장하는 사용자 테이블역할은 사용 권한의 합계로 계산됩니다.
::

'Ketan'은 'User-Add'(bit=1)는 'Blog-Delete'(bit-64)는 65(1+64)는 'Blog-Delete'(bit-64)는 'User-Add'(bit=1)는 'Blog-Delete'(bit-64)를 말합니다.
) 및 을 가진 사용자 '128가블로그 보기' (128) 및 '사용자 삭제' ( 4 ) 권 '메하타' 132 ( 128 + 4 ) 。

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `role` int(11) NOT NULL,
  `created_date` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

샘플 데이터-

INSERT INTO `user` (`id`, `name`, `role`, `created_date`)
   VALUES (NULL, 'Ketan', '65', '2013-01-09 00:00:00'),
   (NULL, 'Mehata', '132', '2013-01-09 00:00:00');

사용자 권한 사용 로그인 후 사용자 권한을 로드하려면 아래에 문의하여 권한을 얻을 수 있습니다.

SELECT permission.bit,permission.name  
   FROM user LEFT JOIN permission ON user.role & permission.bit
 WHERE user.id = 1

user.role "&" 권한입니다.bit는 Bitwise 연산자로, 다음과 같이 출력을 제공합니다.

User-Add - 1
Blog-Delete - 64

특정 사용자에게 사용자 편집 권한이 있는지 여부를 확인하려면-

  SELECT * FROM `user` 
     WHERE role & (select bit from permission where name='user-edit')

출력 = 행 없음.

http://sforsuresh.in/implemention-of-user-permission-with-php-mysql-bitwise-operators/도 참조할 수 있습니다.

사용자의 요구에 맞는 패턴을 역할 기반 액세스 제어라고 합니다.

PHP에는 Zend_Acl(good documentation), phpGACL Tiny를 포함한 몇 가지 좋은 구현이 있습니다.ACL. 대부분의 프레임워크에는 어떤 형태로든 독자적인 ACL 구현도 있습니다.

독자적인 솔루션을 도입하는 경우에도, 이러한 솔루션과 같은 뛰어난 요소를 갖춘 솔루션을 검토하는 것이 도움이 됩니다.

사용 권한 그룹을 원하지 않을 수 있습니다.대신 사용자 그룹을 만들고, 사용자 그룹에 권한을 부여하고, 사용자를 그룹에 배치하십시오.또한 사용자는 자신이 속한 그룹의 권한을 재정의할 수 있어야 합니다.사용자가 pemission을 가진 여러 그룹에 속해 있는 경우 항상 Deny는 인가를 덮어씁니다.

요약:

  • 사용자에게 0 이상의 권한(grany, deny)이 있습니다.
  • 사용자가 0개 이상의 그룹에 속해 있습니다.
  • 그룹에 0 이상의 사용 권한(허가, 거부)이 있습니다.

저는 조금 다른 구조를 가지고 있었지만 참고가 될 수 있을 것입니다.

각 사용자에게는 '역할', '그룹'이 있습니다.ID'와 관련된 그룹 테이블 및 그룹 테이블아이디는.그럼 3개의 허가표가 있습니다.

PermissionMaster(FormName)

PermissionChild(PermissionMasterID, PermissionName, Desc, DefaultValue, DependOn) ★★★★★★★★★★★★★★★★★」

PermissionGroupChild(GroupID, PermissionChildID, Allow)

PermissionMaster는 권한이 참조하는 이름/폼/모듈을 보유합니다.Permission Child는 '작성', '보기', '편집', '삭제' 및 설명 등 각 마스터에서 사용 가능한 모든 권한을 나열합니다(첫 번째 버전에는 이 권한이 없었고, 1개의 모듈에도 너무 많은 권한 설정이 있을 때 혼란스러워지기 시작했습니다).'ChangeTimeStamp'와 같은 일부 기능을 구체적으로 참조하도록 하위 항목을 추가하면 'Edit'보다 더 구체적인 권한이 허용됩니다.

다음으로 Permission Group Child는 Permission Child와 Group 테이블 사이의 링크가 됩니다.모든 그룹에는 Permission Child 세트가 복사되어 기본 설정으로 설정됩니다.그 후 각 사용자에 대해 테이블을 조회하고 확인하는 권한 클래스가 있었습니다.로그인 시에만 로드합니다.그리고 모든 양식/모듈에서 적절한 권한을 확인하고 UI를 적절하게 적용합니다.

역할에 대해서는 Login 설정 페이지에서만 사용합니다.역할 값이 작을수록 순위가 높아집니다.따라서 사용자는 자신과 역할 값이 자신보다 높은 역할 값만 볼 수 있습니다.자신보다 낮은 등급의 편집은 가능하지만 유사하지는 않습니다.

그룹 및 사용자(Active Directory LDAP 솔루션 등)가 있습니다.따라서 그룹에 대한 액세스 권한을 부여하려면 이 그룹의 사용자가 액세스 권한을 가지고 있어야 합니다.

그래서 아래의 @suresh-kamrushi 답변을 바탕으로 이렇게 만들었습니다.

INSERT INTO `permission` (`bit`, `name`) VALUES
(1,   'add-yes'),
(2,   'add-no'),
(4,   'edit-yes'),
(8,   'edit-no'),
(16,  'del-yes'),
(32,  'del-no'),
(64,  'view-yes'),
(128, 'view-no');

사용자가 비트를 가지고 있는 경우00000000, 처음 두 자리 숫자를 사용합니다.00즉,add-yes그리고.add-no그룹 권한에서 상속됩니다.

사용자가 비트를 가지고 있는 경우01010110, 처음 두 자리 숫자를 사용합니다.01즉,add-no는 그룹 권한에 따라 프라이밍되므로 이 사용자는 추가 권한이 없습니다.이 비트는 사용자가 보기만 할 수 있음을 나타냅니다.

또, 부모 그룹과도 제휴하고 있습니다.

이 솔루션에 대해 어떻게 생각하십니까?누구 더 좋은 방법 없어요?

언급URL : https://stackoverflow.com/questions/333620/best-practice-for-designing-user-roles-and-permission-system

반응형