在Pyramid中使用认证

10 投票
1 回答
2211 浏览
提问于 2025-04-17 12:29

在Pyramid的文档中,Sqlalchemy的分发教程使用了假数据在security.py里。我需要使用MySQL的数据,所以我这样实现:

我的登录代码

@view_config(route_name='login', renderer='json',permission='view')
def user_login(request):
    session = DBSession
    username = request.params['username']
    password = request.params['password']
    sha = hashlib.md5()
    sha.update(password)
    password = sha.digest().encode('hex')
    user = session.query(Users).filter(and_(Users.username==username,Users.password ==password)).count()   
    if(user != 0):
        headers = remember(request, username)
        return HTTPFound(location = '/index/',
                             headers =headers)
    else:
        print "error"

上面的代码让系统记住了用户名,这个用户名会在security.py中使用。接下来,我用这个用户名来获取用户所在的组。

from .models import (
    DBSession,
    Users,
    )

def groupfinder(userid, request): 
    session = DBSession()
    for instance in session.query(Users).filter(Users.username==userid):
        group = 'group:'+instance.group  
        lsth = {'userid':[group]}
        return lsth.get  ('userid')   

这样使用Pyramid的授权方式算是最好的做法吗?

1 个回答

14

你的想法是对的。

现在你的 groupfinder 有问题。注意你在一个循环里用了 return 语句。groupfinder 应该在用户有效的情况下,至少返回一个空列表 []。只有在用户无效时,才返回 None

另外,现在用 md5 来处理密码已经不太安全了。可以看看 cryptacular 或 passlib 这些库,使用 bcrypt 来进行更安全的加密。

撰写回答