【问题标题】:Pyramid authorization being bypassed金字塔授权被绕过
【发布时间】:2014-07-23 15:13:18
【问题描述】:

我刚刚根据the docs为我的金字塔申请添加了授权。目前该应用只显示信息。

我还将从 MySQL 获取我的登录信息,所以我实现了类似于this 的东西。

但是,它并不能正常工作,我不知道如何解决它:

注销后,我只需输入目标页面 URL 即可绕过整个登录。在我看来,它并没有“忘记”登录。当我直接输入网址时,它也不会重定向到登录页面。

这是我的views.py:

目标页面:

@view_config(route_name='monitor', 
        renderer='monitor:templates/monitor.mak', 
        permission='view'
        )
def monitor(request):

    oEntry_Logins = DBSession.query(Login).order_by(Login.id)
    oEntry_Alerts = DBSession.query(Alert).order_by(Alert.id)

    return {
                'oEntry_Logins' : oEntry_Logins,
                'oEntry_Alerts'   : oEntry_Alerts,
                'logged_in' : request.authenticated_userid,
        }

登录/注销:

@view_config(route_name='login', renderer='templates/login.pt')
@forbidden_view_config(renderer='templates/login.pt')
def login(request):


    login_url = request.route_url('login')
    referrer = request.url
    if referrer == login_url:
        referrer = '/' # never use the login form itself as came_from
    came_from = request.params.get('came_from', referrer)
    message = ''
    login = ''
    password = ''
    if 'form.submitted' in request.params:
        login = request.params['login']
        password = request.params['password']

        user = DBSession.query(User).filter(login==User.name).filter(password==User.password).count()  #DBSession
        if(user != 0):  #DBSession

            headers = remember(request, login)
            return HTTPFound(location = came_from,
                            headers = headers)
        message = 'Failed login'

    return dict(
        message = message,
        url = request.application_url + '/login',
        came_from = came_from,
        login = login,
        password = password,
        )

#logout view
@view_config(route_name='logout')
def logout(self):

    request = self.request

    headers = forget(request)
    return HTTPFound(location = request.route_url('login'),
                    headers = headers)

这是我的模型文件:

...
class RootFactory(object):
    __acl__ = [ (Allow, Everyone, 'view'),
                (Allow, 'group:editors', 'edit') ]
    def __init__(self, request):
        pass

还有我的 security.py 文件:

from .models import (
    DBSession,
    User,
    )

def groupfinder(userid, request): 
    session = DBSession()
    for instance in session.query(User).filter(User.name==userid):

        group = 'group:'  #all are simply part of the same group
        lsth = {'userid':[group]}
    return lsth.get  ('userid')  

目前,出于测试目的,密码仍以明文形式存储在 mysql 数据库中。

如何使这段代码按应有的方式工作?

【问题讨论】:

  • 您的 ACL 列表是什么样的? “查看”权限是对所有人开放,还是仅限于经过身份验证的用户?最后,如果您以“隐身模式”打开一个新的浏览器窗口并转到目标页面,您会被重定向到那里的登录名还是直接进入该页面?
  • 它直接进入页面,似乎没有任何东西被重定向。也许我想象它重定向。我认为它对所有人开放,请检查更新的问题。

标签: python mysql authentication pyramid


【解决方案1】:

还有一个请求 - 你也可以发布你的 groupfinder 函数吗?

所以看起来正在发生的是permission='view' 意味着视图对Everyone 开放。如果您将其更改为permission='edit',那么它将仅对“editors”组的成员可用,但这也取决于从 groupfinder() 返回的内容。

或者,我认为如果您使用(Allow, Authenticated, 'edit'),请将您的权限更改为“编辑”,并且只有在您登录后才允许您访问它。您可能必须将from pyramid.security import Authenticated 添加到您的导入语句中好吧。

【讨论】:

  • 你这个巫师! Groupfinder 已添加到问题中。目标页面现在在隐私浏览中重定向到登录页面,登录后直接跳转到正确的页面。注销也做了它现在应该做的事情。
猜你喜欢
  • 2017-07-03
  • 2021-01-03
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 2019-09-14
  • 2017-06-13
  • 1970-01-01
相关资源
最近更新 更多