我正在努力使用Pyramid框架(伟大的框架),我已经达到了用户授权的程度。我想利用ACL阻止已登录的用户访问注册页面。显然,我可以通过其他方式做到这一点,但我想知道是否有任何方法可以使用金字塔中的工具。
我知道通过向视图添加权限,不符合条件的用户会显示禁止的视图。在我的情况下,我只想重新路由已经成员的用户远离不适用于他们的视图(注册,登录等)。
我尝试__acl__ = [(Deny, Authenticated, 'guest')]
无济于事,因为它阻止了所有用户的登录页面。
另外,在另一个注释中,有没有办法动态更改路线。我希望登录的用户的主页与客人的主页不同。
答案 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']
。当然,如果不存在,您可以在登录后将它们重定向到主屏幕。