2012-09-19 4 views
3

금지 된보기에서 손님을 위해 페이지를 방문하면 모든 회원을 대시 보드로 리디렉션하고 멤버가 페이지를 방문하면 모든 손님을 로그인 페이지로 리디렉션하려고합니다. 이것은 충분히 쉽습니다.피라미드에서 호출 된 뷰에 첨부 된 권한을 얻는 방법은 무엇입니까?

그러나 실패한 권한의 원인이 아닌 HTTPForbidden 오류를 던져서 단순히 사용자에게 이유를 표시해야하는 경우가 있습니다. HTTPForbidden이 실패한 권한 또는 다른 이유의 결과인지 여부를 어떻게 확인할 수 있습니까? pyramid.security.has_permission (아직 시도하지 않았 음)으로 이상한 일을 할 수 있다고 생각하지만, 쉬운 방법이 있어야합니다.

이이 것을 주장했다 2011에서 오래 된 문제는 내가 그것을 테스트하지 않았습니다 How to check what permission failed in authorization in pyramid (pylons 2)?

답변

2

할 일 목록했지만, 제가 수행하려고 할 것입니다 것은에서 HTTPForbidden보다 다른 뭔가를 인상하는 것입니다 이 작업을 수동으로 수행하는 장소. 당신은 HTTPForbidden를 서브 클래 싱 할 수 있습니다

class WeDontLikeYourFace(HTTPForbidden): 
    pass 

def my_view(context, request): 
    if request['face'] != 'beautyful': 
     raise WeDontLikeYourFace("go away") 

그런 다음 당신은 당신의 사용자 정의 예외에 대한 사용자 정의보기를 등록 또는 일부를 수행 할 수 HTTPForbidden에 등록 된 일반보기 방법/다른 물건 경우.

사용자 정의 필드를 서브 클래스에 추가하여 필요한 정보를 전달할 수도 있습니다.

+0

나는 이런 식으로 생각했다. 그러나 나는 쉬운 방법이 있기를 바랬다. – BDuelz

+0

또한 exception_raised_because_permission_failed() else manually_raised_exception_show_reason (exception.reason_msg) 논리가 매우 명시 적이지 않은 로직 인 'show_forbidden_page()'는 피라미드를 통해 수동으로 예외를 발생시키는 거의 의도하지 않은 부작용을 사용하는 것처럼 느껴집니다 기계. – Sergey

2

이것은 사용자가 요구 한 것이 아니지만 여전히 도움이 될 수 있습니다. 귀하의 질문에 대한 올바른 대답은 이미 주어진 것입니다 : HTTPForbidden보다 적절한 특정 예외를 제기하는 것이 좋습니다.

그러나 실제로는 HTTPForbidden 예외를 트리거 한 누락 된 권한에 따라 금지 된보기의 동작을 변경하려면 해당 이름을 가져와야합니다. 누락 된 권한의 이름은 HTTPForbidden 예외 개체 HTTPForbidden.result.permission 안에 있습니다. 하지만 먼저 금지 된보기의 컨텍스트로 HTTPForbidden 예외를 전달해야합니다.

예를 들어 웹 앱에서이 기능을 사용하여 사용자에게 특정 기능에 액세스 할 수없는 이유를 알리는 방법은 다음과 같습니다. 해당하는 경우 관리자에게 ACL을 다시 구성하도록 요청할 수 있습니다.

@forbidden_view_config(renderer='/forbidden.mako') 
def forbidden(context, request): 
    return { 'required_permission': context.result.permission } 

피라미드 1.4와 호환됩니다. 문서에서 아무 것도 찾을 수 없으므로 피라미드를 디버깅하여 해킹했습니다. 이 방법은 깨끗한 솔루션보다 더 많은 해결 방법입니다.