231 lines
5.9 KiB
TypeScript
231 lines
5.9 KiB
TypeScript
/**
|
|
* 권한 체크 유틸리티
|
|
* 3단계 권한 체계: SUPER_ADMIN / COMPANY_ADMIN / USER
|
|
*/
|
|
|
|
import { PersonBean } from "../types/auth";
|
|
|
|
/**
|
|
* 권한 레벨 Enum
|
|
*/
|
|
export enum PermissionLevel {
|
|
SUPER_ADMIN = "SUPER_ADMIN", // 최고 관리자 (전체 시스템)
|
|
COMPANY_ADMIN = "COMPANY_ADMIN", // 회사 관리자 (자기 회사만)
|
|
USER = "USER", // 일반 사용자
|
|
}
|
|
|
|
/**
|
|
* 사용자가 슈퍼관리자인지 확인
|
|
* @param user 사용자 정보
|
|
* @returns 슈퍼관리자 여부
|
|
*/
|
|
export function isSuperAdmin(user?: PersonBean | null): boolean {
|
|
if (!user) return false;
|
|
return user.companyCode === "*" && user.userType === "SUPER_ADMIN";
|
|
}
|
|
|
|
/**
|
|
* 사용자가 회사 관리자인지 확인 (슈퍼관리자 제외)
|
|
* @param user 사용자 정보
|
|
* @returns 회사 관리자 여부
|
|
*/
|
|
export function isCompanyAdmin(user?: PersonBean | null): boolean {
|
|
if (!user) return false;
|
|
return user.userType === "COMPANY_ADMIN" && user.companyCode !== "*";
|
|
}
|
|
|
|
/**
|
|
* 사용자가 관리자인지 확인 (슈퍼관리자 + 회사관리자)
|
|
* @param user 사용자 정보
|
|
* @returns 관리자 여부
|
|
*/
|
|
export function isAdmin(user?: PersonBean | null): boolean {
|
|
return isSuperAdmin(user) || isCompanyAdmin(user);
|
|
}
|
|
|
|
/**
|
|
* 사용자가 일반 사용자인지 확인
|
|
* @param user 사용자 정보
|
|
* @returns 일반 사용자 여부
|
|
*/
|
|
export function isRegularUser(user?: PersonBean | null): boolean {
|
|
if (!user) return false;
|
|
return (
|
|
user.userType === "USER" ||
|
|
user.userType === "GUEST" ||
|
|
user.userType === "PARTNER"
|
|
);
|
|
}
|
|
|
|
/**
|
|
* 사용자의 권한 레벨 반환
|
|
* @param user 사용자 정보
|
|
* @returns 권한 레벨
|
|
*/
|
|
export function getUserPermissionLevel(
|
|
user?: PersonBean | null
|
|
): PermissionLevel | null {
|
|
if (!user) return null;
|
|
|
|
if (isSuperAdmin(user)) {
|
|
return PermissionLevel.SUPER_ADMIN;
|
|
}
|
|
|
|
if (isCompanyAdmin(user)) {
|
|
return PermissionLevel.COMPANY_ADMIN;
|
|
}
|
|
|
|
return PermissionLevel.USER;
|
|
}
|
|
|
|
/**
|
|
* DDL 실행 권한 확인 (슈퍼관리자만)
|
|
* @param user 사용자 정보
|
|
* @returns DDL 실행 가능 여부
|
|
*/
|
|
export function canExecuteDDL(user?: PersonBean | null): boolean {
|
|
return isSuperAdmin(user);
|
|
}
|
|
|
|
/**
|
|
* 회사 데이터 접근 권한 확인
|
|
* @param user 사용자 정보
|
|
* @param targetCompanyCode 접근하려는 회사 코드
|
|
* @returns 접근 가능 여부
|
|
*/
|
|
export function canAccessCompanyData(
|
|
user?: PersonBean | null,
|
|
targetCompanyCode?: string
|
|
): boolean {
|
|
if (!user) return false;
|
|
|
|
// 슈퍼관리자는 모든 회사 데이터 접근 가능
|
|
if (isSuperAdmin(user)) {
|
|
return true;
|
|
}
|
|
|
|
// 자기 회사 데이터만 접근 가능
|
|
return user.companyCode === targetCompanyCode;
|
|
}
|
|
|
|
/**
|
|
* 사용자 관리 권한 확인 (관리자만)
|
|
* @param user 사용자 정보
|
|
* @param targetCompanyCode 관리하려는 회사 코드
|
|
* @returns 사용자 관리 가능 여부
|
|
*/
|
|
export function canManageUsers(
|
|
user?: PersonBean | null,
|
|
targetCompanyCode?: string
|
|
): boolean {
|
|
if (!user) return false;
|
|
|
|
// 슈퍼관리자는 모든 회사 사용자 관리 가능
|
|
if (isSuperAdmin(user)) {
|
|
return true;
|
|
}
|
|
|
|
// 회사 관리자는 자기 회사 사용자만 관리 가능
|
|
if (isCompanyAdmin(user)) {
|
|
return user.companyCode === targetCompanyCode;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* 회사 설정 변경 권한 확인 (관리자만)
|
|
* @param user 사용자 정보
|
|
* @param targetCompanyCode 설정 변경하려는 회사 코드
|
|
* @returns 설정 변경 가능 여부
|
|
*/
|
|
export function canManageCompanySettings(
|
|
user?: PersonBean | null,
|
|
targetCompanyCode?: string
|
|
): boolean {
|
|
return canManageUsers(user, targetCompanyCode);
|
|
}
|
|
|
|
/**
|
|
* 회사 생성/삭제 권한 확인 (슈퍼관리자만)
|
|
* @param user 사용자 정보
|
|
* @returns 회사 생성/삭제 가능 여부
|
|
*/
|
|
export function canManageCompanies(user?: PersonBean | null): boolean {
|
|
return isSuperAdmin(user);
|
|
}
|
|
|
|
/**
|
|
* 시스템 설정 변경 권한 확인 (슈퍼관리자만)
|
|
* @param user 사용자 정보
|
|
* @returns 시스템 설정 변경 가능 여부
|
|
*/
|
|
export function canManageSystemSettings(user?: PersonBean | null): boolean {
|
|
return isSuperAdmin(user);
|
|
}
|
|
|
|
/**
|
|
* 권한 에러 메시지 생성
|
|
* @param requiredLevel 필요한 권한 레벨
|
|
* @returns 에러 메시지
|
|
*/
|
|
export function getPermissionErrorMessage(
|
|
requiredLevel: PermissionLevel
|
|
): string {
|
|
const messages: Record<PermissionLevel, string> = {
|
|
[PermissionLevel.SUPER_ADMIN]:
|
|
"최고 관리자 권한이 필요합니다. 전체 시스템을 관리할 수 있는 권한이 없습니다.",
|
|
[PermissionLevel.COMPANY_ADMIN]:
|
|
"관리자 권한이 필요합니다. 회사 관리자 이상의 권한이 필요합니다.",
|
|
[PermissionLevel.USER]: "인증된 사용자 권한이 필요합니다.",
|
|
};
|
|
|
|
return messages[requiredLevel] || "권한이 부족합니다.";
|
|
}
|
|
|
|
/**
|
|
* 권한 부족 에러 객체 생성
|
|
* @param requiredLevel 필요한 권한 레벨
|
|
* @returns 에러 응답 객체
|
|
*/
|
|
export function createPermissionError(requiredLevel: PermissionLevel) {
|
|
return {
|
|
success: false,
|
|
error: {
|
|
code: "INSUFFICIENT_PERMISSION",
|
|
details: getPermissionErrorMessage(requiredLevel),
|
|
},
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 사용자 권한 정보 요약
|
|
* @param user 사용자 정보
|
|
* @returns 권한 정보 객체
|
|
*/
|
|
export function getUserPermissionSummary(user?: PersonBean | null) {
|
|
if (!user) {
|
|
return {
|
|
level: null,
|
|
isSuperAdmin: false,
|
|
isCompanyAdmin: false,
|
|
isAdmin: false,
|
|
canExecuteDDL: false,
|
|
canManageUsers: false,
|
|
canManageCompanies: false,
|
|
canManageSystemSettings: false,
|
|
};
|
|
}
|
|
|
|
return {
|
|
level: getUserPermissionLevel(user),
|
|
isSuperAdmin: isSuperAdmin(user),
|
|
isCompanyAdmin: isCompanyAdmin(user),
|
|
isAdmin: isAdmin(user),
|
|
canExecuteDDL: canExecuteDDL(user),
|
|
canManageUsers: isAdmin(user),
|
|
canManageCompanies: canManageCompanies(user),
|
|
canManageSystemSettings: canManageSystemSettings(user),
|
|
};
|
|
}
|