2016-08-06 58 views
0

我想在web2py中創建一個更改密碼錶單。我正在使用db.auth_user表。我想創建一個帶有字段的表格['current_password','new_password','repeat_password']web2py在表格中檢查密碼

如果密碼輸入不正確,表單應該向用戶發出警告。

我的代碼是:

request.vars.current_password = request.vars.current_password if request.vars.current_password else 'xxx' 

user_password_form = SQLFORM.factory(Field('current_password', 'password', 
              requires=IS_EQUAL_TO(db(db.auth_user.id == auth.user_id).select('password').first().password)(
                   str(db.auth_user.password.validate(request.vars.current_password)[0]))), 
            Field('new_password', 'password'), 
            Field('repeat_password', 'password', 
              requires=IS_EQUAL_TO(request.vars.new_password, 
                   'Passwords do not match'))) 

我已經測試了下面的代碼驗證,並將它設置正確,如果輸入的密碼是= 1。但在表單驗證我不知道如何實現它

if request.vars.current_password: 
     if db.auth_user.password.validate(request.vars.current_password)[0] == db(
         db.auth_user.id == auth.user_id).select('password').first().password: 
      a=1 

任何想法如何實現密碼驗證?

+0

我試圖在這裏實施小組討論:https://groups.google.com/forum/#!topic/web2py/eqbXmseZ6XA – becinyus

回答

1

web2py認證系統包含一個內置的密碼更改操作。如果您在default.py控制器中使用默認user操作,則可以通過/ myapp/default/user/change_password訪問此表單。

如果您更願意只爲了這個目的創建一個單獨的控制器動作,你可以簡單地做:

def change_password(): 
    return dict(form=auth.change_password()) 

,並在相關的觀點:

{{=form}} 

關於你的自定義代碼,你不能單獨使用驗證程序,因爲它需要一個表達式,該表達式必須等於隨表單提交的值(您不能使用已轉換的值調用驗證程序,因爲這將返回一個元組,但requires attri bute必須是一個需要字段和值的可調用對象)。

相反,你可以使用CRYPT驗證,然後在列表中IS_EQUAL_TO驗證 - 第一確認將改變提交密碼的哈希,然後第二個會測試與存儲的密碼哈希平等。

或者,你可以使用:

def check_password(password): 
    new_hash = db.auth_user.password.validate(password)[0] 
    return new_hash == auth.user.password 

form = SQLFORM.factory(Field('current_password', 'password') 
          requires=IS_EXPR(check_password)), 
         ...) 

IS_EXPR驗證可以採取將要傳遞的值的函數,該函數應該返回TrueFalse(注意,這種用法是沒有記錄 - 在本書僅顯示了替代用法,您將Python代碼作爲字符串提供,這將是exec'ed)。

+0

這是偉大的安東尼。非常感謝。 – becinyus