Closed ucharles closed 2 years ago
설명이 좀 부족했던거 같은데, react-admin에서 getPermissions의 목적은 말씀하신대로가 맞습니다. 하지만 getPermissions를 checkAuth의 대용으로 사용하고자 했던 이유는 페이지 접근 권한 설정때문입니다. 아래 과정을 거쳐서 결정하게 되었는데요..
애초에 react-admin이 관리자용 페이지를 쉽게 만들기 위함이 목적인듯 하여 저희가 만드는 웹이랑은 거리가 좀 있어보이긴합니다..
정현씨가 말씀하신대로 하려면 아래 두가지 방안이 있을 것 같습니다. 1.Authprovider에서 인증 Context를 사용할 수 있도록 좀 더 연구해서 수정하는 방법 2.react-admin 포기...
위 수정 코드를 반영하는 것으로 3번은 해결됩니다. 나머지 1, 2, 4번도 이 문서를 참조하시면 해결되지 않을까 싶습니다. 4.0 업데이트에 맞춰 자세한 문서가 추가되었습니다. https://marmelab.com/react-admin/doc/4.0/Permissions.html
서버요청이 없는 페이지의 경우 3번이 일단 해결되지 않습니다.. URL로 접근이 가능합니다. checkAuth를 실행하지만 페이지 로드는 되고요. 그 다음 다른 메뉴로 접속하려고 하면 로그인 페이지로 리다이렉트 됩니다.
현재 각페이지에서 서버 요청이 되지 않고 있기 때문에, URL접속시 페이지 로드가 가능한 것 같고 서버 요청이 있고 서버의 check-auth 미들웨어를 거친다면 로그인 페이지로 리다이렉트 시킬 수 있습니다.
하지만 서버 요청이 없는 페이지(예:캘린더생성(/calendar/new))는 페이지 접근이 가능할 수 밖에 없습니다.
수정 예의 checkAuth처럼 서버 요청을 넣으면 해결이 될 것 같습니다만, 이곳에서 서버 요청을 하지 않으려는 이유는 무엇인가요? checkAuth에서는 인증 관련 요청만, getPermission에서는 권한 관련 요청만 하게 함으로써 기능적으로 분리를 하는 것이 좋아보입니다. 실제로 의도대로 동작이 되는 것을 확인했습니다.
checkAuth의 정확한 동작방식은 이렇습니다.
때문에 정확히는 페이지에 서버 요청이 없어서 URL으로 접근이 가능한 것이 아니라, checkAuth에서 reject 되어야 할 올바른 조건이 없기 때문에 그렇습니다. 혹은 logout 에서 resolve를 호출하지 않은 경우, 로그아웃 처리 & 로그인 페이지로 리다이렉트가 되지 않습니다. 이 경우엔 reject에 별도로 리다이렉트 설정이 필요할 수도 있습니다.
좀 더 조사해본 결과는 아래와 같습니다.
<CustomRoutes>
에서는 checkAuth
를 호출하지 않음.
checkAuth
에서 Promise.reject()
를 시켜도 logout
을 호출하지 않음.useAuthenticated
를 사용하여 authProvider
를 호출할 수 있으나,
아주 잠깐 페이지의 내용이 노출되는 현상 발생. (공식 문서에도 관련된 내용이 기재되어 있음)useAuthState
를 사용하여 authProvider
의 응답이 있기 전까지
페이지 표시를 하지 않을 수 있음. 페이지 접속을 완전 차단하는 형태는 아니라 2번처럼 아주 잠깐 페이지의 내용이 노출됨.
(노출 시간은 2번보단 짧음. 화면이 깜빡이는 정도)getPermission
사용이 불가피한 듯함./ (dashboard)
에서 checkAuth
가 작동했던 이유는 <CustomRoutes>
가 아니었기 때문.
(서버 요청과는 관련 없음. 서버 요청은 되지 않고 있었다.)getPermission
을 사용하는 것으로 결정. Close 하겠습니다.
react-admin
의checkAuth
와getPermission
을 잘못 이해하고 사용했던 것 같습니다. 이 PR의 수정이 필요합니다. https://github.com/ucharles/Comrade/pull/21 관련 이슈 https://github.com/ucharles/Comrade/issues/11결론
checkAuth
에서 사용자가 로그인 상태인지 확인(LoggedIn
) & 접근제한을 시킬 수 있음수정 방법
checkAuth
logout
백엔드 API를 수정했습니다. 로그아웃 호출 시 403 에러를 뱉지 않게 했습니다. 아래의 코드로 로그아웃 처리가 가능합니다.
getPermission
새롭게 추가된 달력 권한 습득 API를 이용하여 권한을 습득하시면 될 것 같습니다.
GET /api/calendar/admin
이와 같은 객체로 리턴됩니다.
{ calendars: [ {calendarId: "xxx", isAdmin: true}, {...} ] }
관련 이슈: https://github.com/ucharles/Comrade/issues/20
문서 내용
checkError
checkAuth
getPermission