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


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.