2016-08-06 2 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}} 

사용자 정의 코드에 관해서는, 당신은 할 수 없습니다 IS_EQUAL_TO 유효성 검사기 만 사용하십시오. 양식과 함께 제출 된 값과 같아야하는 표현식이 필요합니다 (변환 된 값을 사용하여 유효성 검사기를 호출 할 수 없습니다. 터플을 반환하기 때문에 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 검증이 값을 전달하는 기능을 수행 할 수 있으며, 함수가 True 또는 False (메모를 반환해야합니다,이 사용은 문서화하지 않는 경우 - 책은 파이썬 코드를 문자열로 제공하는 대체 사용법만을 보여줍니다 (exec'ed).

+0

멋진 Anthony입니다. 고마워. – becinyus