【发布时间】: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