我在金字塔框架(GreatFramework)上的工作让我大吃一惊,我已经到了用户授权的地步。我想利用ACL阻止已经登录的用户访问注册页。很明显,我可以用其他方法来做,但我想知道是否有任何方法可以用金字塔中的工具来做。
我知道,通过向视图添加权限,不符合条件的用户将被显示为禁止视图。在我的例子中,我只想将已经是成员的用户从不适用于他们的视图(注册、登录等)中重新路由。
我尝试过__acl__ = [(Deny, Authenticated, 'guest')]
但没有成功,因为它会阻塞所有用户的登录页面。
另外,在另一方面,是否有任何方法可以动态地更改路由。我希望登录用户的主页与访客的不同。
最佳答案
您需要调查身份验证策略返回的主体,以了解发生了什么在INI文件中打开pyramid.debug_authorization
很容易判断。授权策略将把找到的ACL与通过pyramid.security.effective_principals(request)
返回的主体进行比较。如果这些不匹配,应该清楚发生了什么。
实现基于表单的登录的方法是(假设金字塔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']
添加到URL中。当然,如果没有,你可以在登录后将它们重定向到主屏幕。