2012-02-25 42 views
3

我正在用金字塔框架(伟大的框架)工作,我已经到了用户授权的地步。我想利用ACL来阻止已经登录的用户访问注册页面。显然,我可以通过其他方式做到这一点,但我想知道是否有办法使用金字塔中的工具来做到这一点。金字塔身份验证系统有多灵活?

我知道,通过向视图添加权限,不符合条件的用户将显示一个禁止视图。就我而言,我只是想将已经成员的用户从不适用于他们的视图(注册,登录等)转移出去。

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

另外,在另一个说明中,有没有什么办法可以动态地改变路线。我希望主页对登录的用户而言不同于用户的主页。

+1

金字塔的身份验证系统非常灵活,这就是为什么它可能很难缠绕你的头。我无法真正告诉你你从ACL的单个片段中做错了什么,但是我可以告诉你,如果你打开'pyramid.debug_authentication',它将有助于告诉你的验证策略返回哪些主体。 – 2012-02-25 22:50:28

+0

谢谢迈克尔。所以我假设我确实朝着正确的方向走了一段我放的片段? – BDuelz 2012-02-26 01:08:24

+0

另外,当禁止视图被调用时,是否有办法获得被调用的初始请求,以便我可以相应地采取行动并重定向到正确的页面? – BDuelz 2012-02-26 01:10:10

回答

3

您需要调查身份验证策略返回的主体以了解发生了什么。很容易判断您是否在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参数添加到URL作为request.GET['came_from']。当然,如果那不在那里,您可以在登录后将它们重定向到主屏幕。

+0

我很抱歉Michael,但我设置的acl仍然不起作用,我不知道为什么。调试信息表示:'debug_authorization of url http:// localhost:6543/register(view name u''against context ):ACLDenied permission'guest''via ACE''在ACL上[<'Allow','system.Authenticated','member'),('Deny','system.Authenticated','guest')]]上的上下文 'system.Everyone']' – BDuelz 2012-03-17 20:45:50

+0

代码是:'__acl__ = [(Allow,Authenticated,'member'),(Deny,Authenticated,'guest')]' – BDuelz 2012-03-17 20:46:44

+0

当我使用guest权限'@view_config(route_name = 'register',renderer ='register.mako',permission ='guest')',我得到误报(阻止未经验证的用户注册)。 – BDuelz 2012-03-17 20:48:08

相关问题