권한 관리 시스템 개선
✨ 새로운 기능: - 사용자별 세분화된 권한 체크 (can_manage_books, can_manage_notes, can_manage_novels) - 페이지별 권한 가드 시스템 추가 (permission-guard.js) - 헤더 메뉴 권한별 표시/숨김 기능 🔧 백엔드 개선: - 모든 문서 관련 API에서 can_manage_books 권한 체크 추가 - documents.py: 개별 문서 조회, PDF 조회 권한 로직 수정 - highlights.py: 하이라이트 생성/조회 권한 체크 개선 - bookmarks.py: 북마크 생성/조회 권한 체크 개선 - document_links.py: 문서 링크 관련 권한 체크 개선 🎨 프론트엔드 개선: - header-loader.js: updateMenuPermissions 함수 추가로 권한별 메뉴 제어 - permission-guard.js: 페이지 접근 권한 체크 및 리다이렉트 처리 - 권한 없는 페이지 접근 시 메인 페이지로 안전한 리다이렉트 - 헤더 사용자 정보 상태 보존 로직 추가 🛡️ 보안 강화: - 403 Forbidden 에러 해결 - 권한 없는 사용자의 무단 페이지 접근 차단 - 문서 관리 권한이 있는 사용자는 모든 문서 공유 가능 📱 사용자 경험 개선: - 권한에 따른 메뉴 자동 표시/숨김 - 로그인 상태 유지 개선 - 권한 없는 기능 접근 시 친화적인 알림 및 리다이렉트
This commit is contained in:
@@ -213,7 +213,7 @@
|
||||
|
||||
<!-- 로그아웃 -->
|
||||
<div class="border-t border-gray-100 my-1"></div>
|
||||
<button onclick="handleLogout()" class="flex items-center w-full px-4 py-2 text-sm text-red-600 hover:bg-red-50">
|
||||
<button onclick="console.log('로그아웃 버튼 클릭됨'); if(typeof handleLogout === 'function') { handleLogout(); } else { console.error('handleLogout 함수가 정의되지 않음'); }" class="flex items-center w-full px-4 py-2 text-sm text-red-600 hover:bg-red-50">
|
||||
<i class="fas fa-sign-out-alt w-4 h-4 mr-3"></i>
|
||||
로그아웃
|
||||
</button>
|
||||
@@ -404,12 +404,53 @@
|
||||
window.location.href = `login.html?redirect=${currentUrl}`;
|
||||
};
|
||||
|
||||
window.handleLogout = () => {
|
||||
// 각 페이지의 로그아웃 함수 호출
|
||||
if (typeof logout === 'function') {
|
||||
logout();
|
||||
} else {
|
||||
console.log('로그아웃 함수를 찾을 수 없습니다.');
|
||||
window.handleLogout = async () => {
|
||||
try {
|
||||
console.log('🔄 로그아웃 시작...');
|
||||
console.log('🔍 window.api 존재 여부:', !!window.api);
|
||||
console.log('🔍 logout 함수 존재 여부:', typeof logout);
|
||||
|
||||
// 각 페이지의 로그아웃 함수가 있으면 호출
|
||||
if (typeof logout === 'function') {
|
||||
await logout();
|
||||
} else {
|
||||
console.log('🔄 직접 로그아웃 처리 시작...');
|
||||
|
||||
// API 로그아웃 시도
|
||||
if (window.api && typeof window.api.logout === 'function') {
|
||||
console.log('🌐 API 로그아웃 호출...');
|
||||
try {
|
||||
await window.api.logout();
|
||||
console.log('✅ API 로그아웃 성공');
|
||||
} catch (apiError) {
|
||||
console.log('⚠️ API 로그아웃 실패:', apiError);
|
||||
}
|
||||
} else {
|
||||
console.log('⚠️ window.api.logout 함수를 찾을 수 없음');
|
||||
}
|
||||
|
||||
// 로컬 스토리지 정리 (항상 실행)
|
||||
console.log('🧹 로컬 스토리지 정리...');
|
||||
localStorage.removeItem('access_token');
|
||||
localStorage.removeItem('refresh_token');
|
||||
localStorage.removeItem('user_info');
|
||||
|
||||
console.log('✅ 로그아웃 완료');
|
||||
}
|
||||
|
||||
// 로그인 페이지로 리다이렉트
|
||||
const currentUrl = encodeURIComponent(window.location.pathname + window.location.search);
|
||||
window.location.href = `login.html?redirect=${currentUrl}`;
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 로그아웃 실패:', error);
|
||||
|
||||
// 에러가 발생해도 로컬 데이터는 정리하고 로그인 페이지로 이동
|
||||
localStorage.removeItem('access_token');
|
||||
localStorage.removeItem('refresh_token');
|
||||
localStorage.removeItem('user_info');
|
||||
|
||||
window.location.href = 'login.html';
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user