Web2py - 如何将用户名字段自动转换为大写

Web2py - Howto Auto Convert Username field to uppercase

我希望所有登录的用户在数据库记录中或在到达数据库之前将他们的名字转换(转换)为大写。

目前我正在使用 LDAP。所以人们可以像这样自由使用登录:

['PREACTIVE','Preactive','preactive','PREactive','preACTIVE']

即使 LDAP 不关心大小写,每个变体都会得到一个新的 Auth_User.id # 和 db.auth_membership.id 的数据库相关性。有 100 多个用户,每个用户都有大约 20 个条目用于 AD 组分配,这真的很混乱。

这是我目前使用的代码:

    ## create all tables needed by auth if not custom tables
    auth.define_tables(username=True)

    auth.settings.create_user_groups=False

    # all we need is login
    auth.settings.actions_disabled=['register','change_password','request_reset_password','retrieve_username','profile']

    # you don't have to remember me
    auth.settings.remember_me_form = True

    # ldap authentication and not save password on web2py
    from gluon.contrib.login_methods.ldap_auth import ldap_auth
    auth.settings.login_methods = [ldap_auth(mode='ad',
       manage_groups= True,
       db = db,
       manage_user = True,
       username_attrib = 'sAMAccountName',
       user_firstname_attrib = 'cn:1',
       user_lastname_attrib = 'sn',
       user_mail_attrib = 'mail',
       group_name_attrib = 'cn',
       group_member_attrib = 'member',
       group_filterstr = 'objectClass=Group',
       server='corp.server.com',
       base_dn='DC=corp,DC=server,DC=com')]

引用自: {http://www.web2pyslices.com/slice/show/1468/how-to-set-up-web2py-ldap-with-windows-active-directory , http://www.web2pyslices.com/slice/show/1715/authentication-and-group-control-with-active-directory-ldap , http://www.web2pyslices.com/slice/show/1476/ldap-auth-with-allowed-groups-and-manage-groups}

从数据库 (CSV) 查看:

auth_user.id,auth_user.first_name,auth_user.last_name,auth_user.email,auth_user.username,auth_user.password,auth_user.registration_key,auth_user.reset_password_key,auth_user.registration_id
1,Pre,Active,p@gmail.com,Preactive,,,,Preactive
2,Pre,Active,p@gmail.com,PREACTIVE,,,,PREACTIVE
3,Pre,Active,p@gmail.com,PREactive,,,,PREactive
4,Pre,Active,p@gmail.com,preACTIVE,,,,preACTIVE

编辑1: 将此添加到 db.py 以尝试在它到达 DB I/O 之前获取变量。但它在数据库中创建了两个条目。一个与 LDAP 组等无关的大写字母。第二个是用户实际输入的内容与 LDAP 组的关联。

def login_upper(form):
    form.vars.username = form.vars.username.upper()
    return form

auth.settings.login_onvalidation = login_upper
auth.settings.profile_onvalidation = login_upper

编辑 2:

Edit1 已放弃。

修改了 ldap_auth.py 中的代码(注意我必须重新启动 web2py.exe 才能看到对 ..\Web2Py\gluon\contrib\login_methods* 所做的更改)

    if ldap_mode == 'ad':
        # Microsoft Active Directory
        if '@' not in username:
            domain = []
            for x in ldap_basedn.split(','):
                if "DC=" in x.upper():
                    domain.append(x.split('=')[-1])
            username = "%s@%s" % (username, '.'.join(domain))
        username_bare = username.split("@")[0].upper()
        con.set_option(ldap.OPT_PROTOCOL_VERSION, 3)

是: username_bare = username.split("@")[0]

现在: username_bare = username.split("@")[0].upper()

当用户登录时,已更正大小写的条目附加了 AD 组,但登录 web2py 会话的当前用户是被推送到数据库中的区分大小写的条目。

编辑 3:

在 Auth() 开始控制用户名字段中的数据后,我似乎无法修改。所以我需要弄清楚如何在调用 Auth() 之前修改登录表单变量。这样所有后续字段都将遵循相同的案例,而不是创建额外的数据库条目……..堵住测试代码和谷歌搜索.....

编辑 4:(最终版)

已修复!!!

def user():
    if request.args(0) == 'login' and request.post_vars.username:
        request.post_vars.username = request.vars.username = request.post_vars.username.upper() # changes field to all uppercase
    return dict(form=auth())

现在用户可以随心所欲地输入他们的名字 (caSewiSe),它会在点击 Auth 之前捕获并转换,并且 db.auth_user.id

中只有一个条目

感谢 Marin Pranjić 2012 post: https://groups.google.com/forum/#!topic/web2py/Tdse7GDwJ28

已解决!!!!!!

Edit4:修复了问题:The solution

def user():
    if request.args(0) == 'login' and request.post_vars.username:
        request.post_vars.username = request.vars.username = request.post_vars.username.upper() # changes field to all uppercase
    return dict(form=auth())

所以这是 IanAuld 所说的一部分,但关键是放在哪里。