$oDocument->grant_cache 를 활용해도 될까요?
CMS/프레임워크 | Rhymix 2.0 |
---|---|
개발 언어 | PHP 7.2 |
문서 열람 페이지인지 확이하는 코드를 구현하는데
마지막에 문제가 걸리는 부분이
$oDocument->isExists() 를 만족하지만
권한이 없는 접근자의 경우 막아주지 않으면 문제가 생기는 경우 이부분까지 막아줘야 하는데요.
디버그를 찍어보니
$oDocument->grant_cache 이 정확하게 열람 권한자가 진입하면 1(true)가 찍히고
권한 없는 자가 접근해서 접근권한 없다는 메시지를 만나게 되면 값이 없어집니다.
해당 모듈의 권한까지 조회해서 비로그인인 접근자가 권한이 있는 문서인지 확인하는 것 보다 이게 효율이 더 높은지 아니면 사용하면 안되는 건지 궁금합니다.
그리고 XE에서도 가지는 값인가요?
댓글 11
가능하면 내부 자료 구조에 의존하지 말고 공식 제공하는 함수를 사용하시기 바랍니다. grant_cache는 $oDocument->isGranted(), $oDocument->isAccessible() 등의 함수에서 내부적으로 사용하는 변수로 기억합니다. 이름 그대로 권한과 관련된 일부 데이터를 캐싱하는 용도이지만, 모듈의 접근 권한까지 체크하지는 않을 수도 있습니다. 데이터가 캐싱되기 전에 그 변수를 사용하면 엉뚱한 값이 나올 가능성도 있고요.
타임라인 같은 곳에서는 이미 진입을 했기에 원하는 값을 얻지 못할 수도 있을 것 같긴 합니다.(이때는 값을 못받아도 상관은 없지만요. 게시글로 진입했는지 아닌지만 확인하는 거라...)
네. 그냥 모듈에 권한 조회한 다음 현재 접근자 신분으로 권한있는지 조회하는 방식으로 그냥 사용해야겠습니다.
타임라인 모듈이 하위 모듈에서 설정된 권한에 의존되지 못하고 전부 열람 되어 버리는 문제가 이런 문제였고 타임라인 자체 버그가 아니라 수정하려다고 수정을 못하고 마무리가 된게 아닌가 하네요. 아마도 라이믹스 2.0 통합게시판에서도 같은 현상이 나타날 겁니다.(문서 자체의 비밀글은 체크가 바로 되기에 이건 통합게시판에서도 동일하게 차단 작동하죠.)
덕분에 제가 최근에 애드온으로 문서의 원래 모듈의 권한을 체크해서 리턴 시키는 작업으로 회피했는데요.
애드온이 계속 필요하지 않을 수 있다면 좋겠지만....
접근 권한이 서로 다른 게시판들을 묶어서 타임라인으로 보여주는 것부터가 좀 레어한 방식이라...
글읽기 시도시 원본 게시판의 권한 체크 정도는 타임라인에서도 가능하지 않을까 합니다. 어차피 그 정보 다 가져와서 주물러서 처리하도록 되어 있으니까요.
더 깔끔하게 아예 목록에도 나오지 않도록 하려면 좀더 복잡하겠지요. 타임라인에서 유저의 권한에 따라 일부 게시판을 제외하고 (즉, 관리자가 설정한 게시판의 집합과 유저가 접근할 수 있는 게시판의 집합의 교집합을 구해서) 불러오는 식으로 구현해야 할 텐데, 이렇게 수시로 목록이 달라진다면 캐싱 효율이 떨어지겠지요.
일부를 제외하는게 가장 좋은 선택이긴 하지만 모든 권한이 있는 대부분의 회원들을 위해 통합게시판에 포함시키려는게 운영자가 선택하게 되는 현실이죠. 권한 없는 게시글이 열람되는걸 모르는 운영자도 많을 겁니다.
뭐 최근에는 애드온 개발이 가능해서 애드온으로 권한 없는 게시글은 차단하고 있으니 문제는 없습니다.
네. 말씀하신 타임라인 모듈에서 가능합니다. 제가 애드온으로 제작했으니까요....