自定义web2py注册

时间:2011-12-30 10:46:51

标签: python authentication web2py

我是web2py的新手。我想创建一个有一个管理员的应用程序(超级用户) 帐户。我想限制'只有管理员可以注册用户'。以便 一旦管理员登录到应用程序,他将看到不同的菜单,如'Home', '设置'和'注册用户'。我完成了其他选择,但我 在“注册用户”中遇到问题。

在我的应用程序中有一个“注册”链接 - http://127.0.0.1:8000/filemanager2/default/user/register。但是当我点击它时,我明白了 重定向到配置文件页面。这是因为管理员用户已经登录了 in并因此在点击注册链接后显示管理员 帐户的个人资料。我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:6)

如果你想利用内置的Auth register()函数,你可以按照以下方式破解它:

@auth.requires_membership('admin')
def register()
    admin_auth = session.auth
    auth.is_logged_in = lambda: False
    def post_register(form):
        session.auth = admin_auth
        auth.user = session.auth.user
    auth.settings.register_onaccept = post_register
    return dict(form=auth.register())

通常,Auth.register()会检查用户是否已登录,如果是,则重定向到配置文件页面。上面用一个简单返回False的lambda替换auth.is_logged_in()方法,因此不会发生重定向。 Auth.register()还将session.auth和auth.user设置为与新注册用户关联的值,因此上面的代码保存了admin的值,并使用register_onaccept回调将session.auth和auth.user恢复为admin的值。

另一种方法是简单地基于db.auth_user表创建自己的注册表单,并使用Auth.get_or_create_user()方法添加新用户:

@auth.requires_membership('admin')
def register():
    form = SQLFORM(db.auth_user)
    if form.validate():
        admin_user = auth.user
        auth.get_or_create_user(form.vars)
        auth.user = admin_user
    return dict(form=form)

但是,在这种情况下,您将无法获得内置register()函数自动添加到注册表单的密码验证字段。与内置的register()方法一样,get_or_create_user()也将auth.user设置为新用户的记录,因此在插入后必须将其重新设置回admin用户的记录。

注意,上述两种方法都会自动为新用户创建一个新的唯一Auth组,如果auth.settings.create_user_groups为True(这是默认值),则将用户分配给该组。您可以简单地使用标准SQLFORM添加新用户,而不是上述方法,但您必须手动创建和添加组。

我们应该添加一个选项,以使这更容易。