我正在使用Pyramid框架(大型框架)工作,现在我已经谈到了用户授权.我想利用ACL来阻止已经登录的用户访问注册页面.显然,我可以通过其他方式来执行此操作,但是我想知道是否有任何方法可以使用金字塔中的工具来执行此操作.
我知道,通过向视图添加权限,不符合条件的用户将显示为禁止视图.就我而言,我只是想重新路由已经是成员的用户,使其远离不适用于他们的视图(注册,登录等).
我尝试__acl__ = [(Deny,Authenticated,’guest’)]无济于事,因为它阻止了所有用户的登录页面.
另外,还有一点需要注意的是,有没有办法动态地改变路线.我希望登录的用户的主页与访客的主页不同.
解决方法:
您需要调查身份验证策略所返回的主体,以了解发生了什么.很容易判断您是否在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’]添加到URL.当然,如果不存在,您可以在登录后将其重定向到主屏幕.