金字塔auth系统有多灵活?

时间:2012-02-25 21:27:31

标签: python authorization acl pyramid

我正在努力使用Pyramid框架(伟大的框架),我已经达到了用户授权的程度。我想利用ACL阻止已登录的用户访问注册页面。显然,我可以通过其他方式做到这一点,但我想知道是否有任何方法可以使用金字塔中的工具。

我知道通过向视图添加权限,不符合条件的用户会显示禁止的视图。在我的情况下,我只想重新路由已经成员的用户远离不适用于他们的视图(注册,登录等)。

我尝试__acl__ = [(Deny, Authenticated, 'guest')]无济于事,因为它阻止了所有用户的登录页面。

另外,在另一个注释中,有没有办法动态更改路线。我希望登录的用户的主页与客人的主页不同。

1 个答案:

答案 0 :(得分:3)

您需要调查身份验证策略返回的主体,以了解正在发生的情况。如果您打开INI文件中的pyramid.debug_authorization,则很容易判断。授权策略将比较找到的ACL与通过pyramid.security.effective_principals(request)返回的主体。如果这些不匹配,应该清楚发生了什么。

实现基于表单的登录的方法是(假设Pyramid 1.3a9 +):

from pyramid.httpexceptions import HTTPSeeOther
from pyramid.security import authenticated_userid
from pyramid.view import forbidden_view_config

@forbidden_view_config()
def forbidden_view(request):
    if authenticated_userid(request):
        # user is already logged in, they are really forbidden
        return request.context # the forbidden 403 response

    url = request.route_url('login', _query={'came_from': request.path})
    return HTTPSeeOther(url)

这会在您的登录视图中将came_from参数添加到网址request.GET['came_from']。当然,如果不存在,您可以在登录后将它们重定向到主屏幕。