金字塔授权被绕过

时间:2014-06-03 10:15:52

标签: python mysql authentication pyramid

我刚刚根据the docs向我的金字塔应用程序添加了授权。此时,应用程序仅显示信息。

我还将从MySQL获取登录信息,因此我实现了与this类似的功能。

然而,它不能正常工作,我不知道如何解决它:

我退出后,只需输入目标网页网址即可绕过整个登录。在我看来,它不会忘记'登录。当我直接输入网址时,它也不会重定向到登录页面。

这是我的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数据库中。

如何使此代码正常工作?

1 个答案:

答案 0 :(得分:1)

然后还有一个请求 - 您是否也可以发布groupfinder功能?

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

或者,我认为如果您使用(Allow, Authenticated, 'edit'),请将您的权限更改为“编辑”,并且只有在您登录时才允许您访问它。您可能需要添加from pyramid.security import Authenticated你的进口报表。