使用金字塔认证与金字塔。

10

在金字塔文档中,Sqlalchemy Dispatch教程在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')   

这是使用金字塔授权的最佳方式吗?


我必须说,这段代码是一个非常好的简要介绍,展示了SQLAlchemy身份验证如何工作(或可以工作)的例子。 - phsource
1个回答

14

您的想法是正确的。

您的 groupfinder 现在出了问题。请注意您有一个 for 循环,其中包含一个 return 语句。如果用户有效,则 groupfinder 应该至少返回一个空列表 []。只有当用户无效时才返回 None

此外,目前使用密码的 md5 散列方式已经很不安全了。可以考虑使用 bcrypt 进行加密哈希,cryptacular 或 passlib 库可提供相关功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接