์งํ์ค์ธ ํ๋ก์ ํธ์์ ์ฌ์ฉ์์๊ฒ ์ฃผ์ด์ง ๊ถํ(์ญํ ) ์ ๋ฐ๋ผ ๋ฉ๋ด, ํ์ ๋ฉ๋ด, ๊ทธ๋ฆฌ๊ณ ๊ฐ ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ ๊ถํ์ ์ ์ดํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
์ฆ, ์ ์ ๋ ๋ณธ์ธ์ ๊ถํ ๋ฒ์ ๋ด์์๋ง ๋ฉ๋ด๊ฐ ๋ณด์ฌ์ผ ํ๊ณ ,
๊ถํ์ด ์๋ ๊ฒฝ์ฐ์ ์์ ๋ฉ๋ด๋ฅผ ๋ณผ์ ์๊ณ ํด๋ฆญ๋ ๋ถ๊ฐ๋ฅํด์ผ ํ๋ค.
์ด๋ฐ ๋ฐฉ์์ ์ผ๋ฐ์ ์ผ๋ก RBAC(Role-Based Access Control)์ด๋ผ๊ณ ๋ถ๋ฆฌ๋๋ฐ,
์ฌ์ฉ์์ ์ญํ (Role)์ ๋ฐ๋ผ ์ด๋ค ๋ฆฌ์์ค(ํ์ด์ง, ๊ธฐ๋ฅ ๋ฑ)์ ์ ๊ทผํ ์ ์๋์ง๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด ๊ธ์์๋ ๋ด๊ฐ ์ค์ ๋ก ๊ตฌํํ ๋ฐฉ์๊ณผ, ๊ทธ ๊ณผ์ ์์ ์ค์ํ๊ฒ ์๊ฐํ๋ ํฌ์ธํธ๋ค์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
์๋ฅผ ๋ค์ด A๋ผ๋ ์ ์ ์ ๊ถํ์ ๋ค์๊ณผ ๊ฐ๋ค.
B
๋ฉ๋ด์ ์ ๊ทผํ ์ ์์
C
๋ฉ๋ด์ ํ์ ํญ ์ค C-2
์๋ง ์ ๊ทผ ๊ถํ์ด ์์
C-2
ํญ์์๋ ์์ฑ(CREATE)
๊ถํ์ด ์์
์ด ์ํฉ์์ UI๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค.
โ
B
๋ฉ๋ด๋ ๋ก๊ทธ์ธ ์ ์์ ๋ณด์ด์ง ์์์ผ ํ๋ค.
โ
C
๋ฉ๋ด ํด๋ฆญ ์, ์๋์ผ๋ก C-2
ํญ์ผ๋ก ๋ฆฌ๋ค์ด๋ ์
๋์ด์ผ ํ๋ค. (url์ ์ง์ ์
๋ ฅ์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์)
โ ๋ค๋ฅธ ํญ์ ๋ณด์ฌ์ง๋, ํด๋ฆญํ๋ฉด "๊ถํ์ด ์์ต๋๋ค" ์๋ฟ์ ๋์์ผ ํ๋ค.
โ
C-2
ํญ ๋ด์์ "์ถ๊ฐํ๊ธฐ" ๋ฒํผ ํด๋ฆญ ์์๋ ๊ถํ ์ฒดํฌ๋ฅผ ํ๊ณ , ์๋ฟ์ ๋์์ผ ํ๋ค.
๋ฐฑ์๋๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋จํ ํํํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๊ฐ ๋ฉ๋ด/ํญ/๋ฆฌ์์ค๋ฅผ ๊ตฌ๋ถํ ์ ์๋๋ก menuCode๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ถํ ์ ๋ณด๋ฅผ ๋๊ฒจ์ฃผ์๋ค.
{
"permissions": [
{
"menu": "C",
"resources": ["READ"],
"subMenus": [
{
"menu": "C-2",
"resources": ["READ"]
}
]
}
]
}
์์
์ ๊ฐ์ฅ ์ค์ํ๊ฒ ์๊ฐํ๋ ํฌ์ธํธ๋, ๋ฌด์กฐ๊ฑด ์์ ํ์ผ์์ ์ ์ดํด์ผ ํ๋ค๋ ์ ์ด์๋ค.
๊ฐ๋ณ ํ์ผ์์ ์ ๊ทผ ๊ถํ์ ๊ด๋ฆฌํ ๊ฒฝ์ฐ ์ฝ๋๊ฐ ํฉ์ด์ง๊ณ ๋ค๋ฅธ ๋ก์ง๋ค๊ณผ ๊ฒน์ณ ์ ์ง๋ณด์์ ์ด๋ ค์์ด ์์ ์ ์๋ค.
๊ทธ๋์ ํ์ด์ง๋ณ Layout
ํ์ผ์ ์์ฑํ๊ณ , ํ์ ํญ๋ณ ๋ผ์ฐํ
์ ์ฐ์ ๋ถ๋ฆฌํ ๋ค
ํด๋น ๋ ์ด์์ ํ์ผ์์ ๋ฉ๋ด, ํญ๋ณ ์ ๊ทผ ์ ์ด๋ฅผ ๊ด๋ฆฌํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ํ์ด์ง์์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก usePermission
์ด๋ผ๋ ์ปค์คํ
ํ
์ ์์ฑํ๋ค.
- menuCode ์์ํ + ๋ผ์ฐํฐ์ ๋ฑ๋ก
์๋ฒ์ชฝ์์๋ ๊ฐ ๋ฉ๋ด, ํ์ ํญ๋ณ๋ก ๊ณ ์ ํ '๋ฉ๋ด์ฝ๋' ๋ฅผ ๋ง๋ค์ด ์ฃผ์๋ค.
๊ฐ ๋ฉ๋ด์ฝ๋๋ฅผ ์์๋ก ์์ฑํ๋ค ๋ผ์ฐํฐ ๋ฆฌ์คํธ์ ํญ ๋ฆฌ์คํธ์ ๋ฉ๋ด์ฝ๋๋ฅผ ๋ฑ๋กํด ์ฃผ์๋ค.- ๊ถํ ์ ์ด๋ ์ด menuCode๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋จํ๋ค.
- ๊ณตํต ์ปค์คํ ํ ์ผ๋ก ๊ถํ ์ ์ด
useLocation hook์ ์ด์ฉํด ํ์ฌ ์์น์ ๋ฐ๋ฅธ ๋ฉ๋ด์ฝ๋๋ฅผ ๋ฐ์์ค๊ณ ,
๋ฉ๋ด์ฝ๋๋ฅผ ์ด์ฉํด ํด๋น ๋ฉ๋ด์ ๋ํ ๊ถํ์ ํ์ธํ ์ ์์๋ค.
// ํน์ ๋ฉ๋ด์ ๋ํ ๊ถํ ํ์ธ
const checkPermission = useCallback(
(menuCode: string): PermissionCheckResult => {
if (!userPermission || !userPermission.permissions) {
return { hasPermission: false, permissionType: null };
}
// ์ง์ ๋ฉ๋ด ์ฝ๋ ๊ฒ์
const directMenuPermission = userPermission.permissions.find(
(permission) => permission.menu === menuCode,
);
....
}
return { hasPermission: false, permissionType: null };
},
[userPermission],
);
๋งค๋ฒ ๋๋ผ์ง๋ง ์ด๋ฐ ์์ ์ ์์ ์ ์ ์ค๊ณํ ๊ฒ๋ ๋ง๊ณ ๋ณต์กํ์ง๋ง ๊ทธ๋งํผ ์ฌ๋ฐ๊ณ ๋ณด๋์ฐฌ ๊ฒ ๊ฐ๋ค.