권한 관리 시스템의 핵심은 효율적인 데이터베이스 설계에 있습니다. 다음은 각 테이블의 상세 구조와 그 역할에 대한 설명입니다.
테이블 이름 | 컬럼 | 설명 |
---|---|---|
Permission | idx (PK), name, description | 개별 권한을 정의합니다. 예: 읽기, 쓰기, 삭제 등 |
Role | idx (PK), name, description | 권한들의 집합을 정의합니다. 예: 편집자, 관리자 등 |
Permission_Role | permission_idx (FK), role_idx (FK) | 권한과 역할을 연결하는 다대다 관계 테이블입니다. |
Group | idx (PK), name, description | 사용자 그룹을 정의합니다. 예: 일반 사용자, VIP 사용자 등 |
Group_Role | group_idx (FK), role_idx (FK) | 그룹과 역할을 연결하는 다대다 관계 테이블입니다. |
User | idx (PK), username, email, group_idx (FK) | 개별 사용자 정보를 저장합니다. |
이 설계를 통해 권한, 역할, 그룹 간의 복잡한 관계를 효과적으로 관리할 수 있습니다.
예를 들어, '편집자' 역할에 '글쓰기', '수정', '삭제' 권한을 부여하고, 이 '편집자' 역할을 'VIP 사용자' 그룹에 할당할 수 있습니다.
각 테이블의 샘플 데이터를 살펴보겠습니다. 이 데이터는 시스템의 작동 방식을 이해하는 데 도움이 될 것입니다.
Permission 테이블
idx | name | description |
---|---|---|
1 | read_post | 게시글 읽기 권한 |
2 | write_post | 게시글 작성 권한 |
3 | edit_post | 게시글 수정 권한 |
4 | delete_post | 게시글 삭제 권한 |
5 | upload_file | 파일 업로드 권한 |
Role 테이블
idx | name | description |
---|---|---|
1 | viewer | 읽기 전용 사용자 |
2 | contributor | 글 작성 가능 사용자 |
3 | editor | 글 수정 가능 사용자 |
4 | admin | 관리자 |
Permission_Role 테이블
permission_idx | role_idx |
---|---|
1 | 1 |
1 | 2 |
1 | 3 |
1 | 4 |
2 | 2 |
2 | 3 |
2 | 4 |
3 | 3 |
3 | 4 |
4 | 4 |
5 | 2 |
5 | 3 |
5 | 4 |
Group 테이블
idx | name | description |
---|---|---|
1 | basic_users | 기본 사용자 그룹 |
2 | premium_users | 프리미엄 사용자 그룹 |
3 | moderators | 중재자 그룹 |
4 | administrators | 관리자 그룹 |
Group_Role 테이블
group_idx | role_idx |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
User 테이블
idx | username | group_idx | |
---|---|---|---|
1 | john_doe | john@example.com | 1 |
2 | jane_smith | jane@example.com | 2 |
3 | mod_alice | alice@example.com | 3 |
4 | admin_bob | bob@example.com | 4 |
이 샘플 데이터를 바탕으로, 시스템이 어떻게 작동하는지 예를 들어 설명해 드리겠습니다:
권한이 없는 액션이 발생할 때 에러를 발생시키는 트리거를 구현하여 데이터베이스 레벨에서 추가적인 보안을 확보할 수 있습니다. 다음은 MariaDB를 기준으로 작성된 트리거 예시입니다:
DELIMITER //
CREATE FUNCTION check_user_permission(user_idx INT, required_permission VARCHAR(50))
RETURNS BOOLEAN
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE user_group_id INT;
DECLARE has_permission BOOLEAN;
-- 사용자의 그룹 ID 조회
SELECT group_idx INTO user_group_id FROM User WHERE idx = user_idx;
-- 사용자가 해당 액션을 수행할 권한이 있는지 확인
SELECT EXISTS (
SELECT 1
FROM Group_Role gr
JOIN Permission_Role rp ON gr.role_idx = rp.role_idx
JOIN Permission p ON rp.permission_idx = p.idx
WHERE gr.group_idx = user_group_id AND p.name = required_permission
) INTO has_permission;
RETURN has_permission;
END //
CREATE TRIGGER check_write_post_permission
BEFORE INSERT ON Post
FOR EACH ROW
BEGIN
IF NOT check_user_permission(NEW.user_idx, 'write_post') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'User does not have permission to write post';
END IF;
END //
CREATE TRIGGER check_edit_post_permission
BEFORE UPDATE ON Post
FOR EACH ROW
BEGIN
IF NOT check_user_permission(NEW.user_idx, 'edit_post') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'User does not have permission to edit post';
END IF;
END //
CREATE TRIGGER check_delete_post_permission
BEFORE DELETE ON Post
FOR EACH ROW
BEGIN
IF NOT check_user_permission(OLD.user_idx, 'delete_post') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'User does not have permission to delete post';
END IF;
END //
DELIMITER ;
이 트리거 설계는 다음과 같이 작동합니다:
check_user_permission()
함수는 사용자 ID와 필요한 권한을 인자로 받아 해당 사용자가 권한을 가지고 있는지 확인합니다.check_user_permission()
함수를 호출하여 권한을 확인합니다.이 과정을 통해 새로운 사용자가 등록될 때마다 일관된 초기 권한 설정이 가능해집니다.
이 과정을 통해 모든 사용자 작업에 대해 실시간으로 권한을 검증할 수 있습니다.
이 워크플로우를 통해 관리자는 유연하게 사용자의 권한을 관리할 수 있습니다.
이 워크플로우에서, 예를 들어 일반 사용자가 포인트를 구매하여 프리미엄 사용자 기준을 충족하면, 그의 그룹이 'basic_users'에서 'premium_users'로 변경됩니다. 이에 따라 사용자는 'viewer' 역할에서 'contributor' 역할로 자동 변경되어, 게시글 작성 권한을 얻게 됩니다.
구현 시 주의사항:
이 네 가지 워크플로우를 통해 사용자 등록부터 권한 관리, 그리고 결제 시스템과의 연동까지 전체적인 시스템의 작동 방식을 이해할 수 있습니다. 각 워크플로우는 서로 연결되어 있으며, 전체 시스템의 유연성과 확장성을 보장합니다.
이 접근 방식을 통해 유연하고 확장 가능한 권한 관리 시스템을 구축할 수 있습니다. 소스 코드의 변경을 최소화하면서도 동적으로 권한을 관리할 수 있어, 다양한 요구사항에 대응할 수 있는 강력한 시스템을 만들 수 있습니다.
워크플로우를 통해 시스템의 작동 방식을 명확히 이해하고 구현할 수 있으며, 이는 개발 팀 전체의 이해도를 높이고 효율적인 협업을 가능하게 합니다.
하지만 이 시스템을 구현할 때는 항상 프로젝트의 특성과 요구사항을 고려해야 하며, 필요에 따라 적절히 수정하고 최적화해야 합니다. 또한 정기적인 검토와 업데이트를 통해 시스템이 프로젝트의 성장과 변화에 계속해서 적합하도록 유지해야 합니다.