我刚刚根据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数据库中。
如何使此代码正常工作?
答案 0 :(得分:1)
然后还有一个请求 - 您是否也可以发布groupfinder
功能?
所以看起来似乎正在发生permission='view'
意味着该视图对Everyone
开放。如果将其更改为permission='edit'
,那么它只对“编辑”组的成员可用,但这也取决于从groupfinder()返回的内容。
或者,我认为如果您使用(Allow, Authenticated, 'edit')
,请将您的权限更改为“编辑”,并且只有在您登录时才允许您访问它。您可能需要添加from pyramid.security import Authenticated
你的进口报表。