사용자 인증 (역할 및 권한) 모듈 설계


15

Delphi UI 응용 프로그램의 백엔드가 될 MS SQL Server 데이터베이스의 사용자 인증 모듈을 모델링하려고합니다. 기본적으로 사용자가 하나의 그룹에만 속한 사용자 계정을 갖고 싶습니다. 그룹은 "n"개의 권한을 가질 수 있습니다.

또한 사용자는 응용 프로그램 설정 (예 : 90 일마다)에 따라 암호를 변경해야하므로 데이터베이스에 암호 기록을 추가하고 싶습니다.

또한 사용자가 로그인 및 로그 아웃 할 때마다 이벤트를 기록하고 싶습니다. 앞으로 추가 이벤트로 확장 할 수 있습니다.

아래에서 내 첫 균열을 찾을 수 있습니다. 이번이 처음 이니 개선을위한 제안을 알려주십시오.

비밀번호 규칙 / 만료 기간에 대한 역할 기반 보안 및 제한 조건에 대한 추가 속성이 필요합니까?

db- 디자인


세부 블로그는 여기에 있습니다 : goo.gl/ATnj6j
Suresh Kamrushi

1
이해가 안 돼요 사용자 테이블에는 group_id가 있습니다. 사람이 둘 이상의 그룹의 구성원이 될 수 있습니까?
johnny

답변:


11

명시된 요구 사항에 따라 모델의 모양이 매우 좋습니다.

다음은 개선을위한 제안입니다.

  • 명시 적으로 말하지 않으므로 말하기가 어렵지만 사용자 암호를 직접 저장하는 것처럼 보입니다. 이것은 매우 나쁠 것입니다! 공통 인증 데이터베이스를 보면 암호가 암호화 된 형식으로 저장됩니다. 당신은 종종 password열과 열을 모두 볼 수 password_salt있습니다.

  • 귀하의 USER_LOGS표는이 Event열을. 이것이 어떻게 채워질 지 확실하지 않습니다. 참조 하는 EVENT_TYPE테이블이 있어야합니까 USER_LOGS? 이로 인해보다 친근한보고가 이루어질 수 있습니다. 일반적인 이벤트에는 로그인, 로그 아웃, 비밀번호 실패, 비밀번호 변경, 비밀번호 재설정, 잠금, 잠금 해제 등이 있습니다.

  • 귀하의 GROUP_RIGHTS테이블에는 누가 권한을 부여했는지 표시되지 않습니다. 감사 추적 목적을 위해 사람들은 종종 누가 기록을 언제 변경했는지에 대한 기록을 유지합니다. 그것은 당신에게 문제가되지 않을 수 있습니다.

비즈니스 요구 사항에 대한 몇 가지 질문은 다음과 같은 몇 가지 측면에서 "교재"역할 기반 보안 패턴과 다릅니다.

  • 사용자가 한 그룹에만있게 하시겠습니까? 역할 기반 보안의 장점은 역할이 정적 인 경향이있는 반면 역할을 수행하는 사람들은 자주왔다 갔다한다는 ​​것입니다. 여기에는 일부 사람들이 종종 "두 개의 모자를 쓴다"는 것이 포함됩니다.

  • 디자인은 부여 전용입니다. 일부 시스템에는 grant revoke가 포함됩니다 . 이를 통해 특정 그룹에서 광범위하게 사용 가능한 권한을 사용할 수 없다고 말할 수 있습니다.

  • USERS디자인 과 같이 사용자 및 계정이 제공 됩니다. 사람사용자 ID 사이에는 종종 차이가 있습니다. 일부 사용자 ID는 팀 또는 컴퓨터 용이며 일부 사용자는 다른 목적으로 여러 사용자 ID를 갖습니다. 이것이 당신에게 도움이 될 구별입니까?


3

비트 연산자는 사용자 권한을 구현하는 가장 좋은 방법이라고 생각합니다. 여기에서는 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, 이름 및 역할을 저장하는 사용자 테이블 역할은 권한의 합계로 계산됩니다.
예 :
'User-Add'(비트 = 1) 및 'Blog-Delete'(비트 -64) 권한이있는 사용자 'Ketan'인 경우 역할은 65 (1 + 64)입니다.
'블로그보기'(비트 = 128) 및 '사용자 삭제'(비트 -4) 권한을 가진 사용자 'Mehata'인 경우 역할은 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 "&"permission.bit는 다음과 같이 출력을 제공하는 비트 연산자입니다.

User-Add - 1
Blog-Delete - 64

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

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

출력 = 행이 없습니다.

당신은 또한 볼 수 있습니다 : http://goo.gl/ATnj6j


100과 같이 권한이 많으면 어떻게해야합니까?
ypercubeᵀᴹ

2
다른 질문에 3 개의 동일한 답변을 게시했습니다! -모두 오늘 몇 분 간격으로 게시되었습니다. 이것은 좋은 연습이 아닙니다. 질문이 동일하거나 유사하다고 생각되는 경우 중복 투표로 마감하도록 투표 할 수 있습니다 (또는 마감에 대한 평판이없는 경우에는 투표 할 수 있습니다).
ypercubeᵀᴹ September

또한 링크를 수정하고 링크 내용을 설명하십시오 (자세한 내용은 블로그 나 다른 사람의 정보 등입니까?)
ypercubeᵀᴹ

동일한 답변을 복사하여 붙여 넣지 말고 많은 오래된 질문에 뿌려주십시오. 해당 질문이 동일한 경우 중복으로 표시하십시오.
Aaron Bertrand
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.