2012-10-02 3 views
0

저는 스프링 보안 코어 플러그인을 통해 생성 된 User 도메인 엔티티의 Grais에서 비밀번호 검증을 구현하려고합니다. 나는 내 기업에 다음 코드를 추가했습니다 :Grails의 사용자 정의 유효성 검사기에서 예외가 발생했습니다.

class User { 
    // Added by the spring security core plugin 
    String password 
    // Added by me 
    String passwordConfirm 

    static constraints = { 
    passwordConfirm blank:false, validator: { val, obj -> 
     if (!obj.password.equals(obj.passwordConfirm)) { 
      return "user.password.confirmation.error" 
     } 
    } 
    } 

    // other methods... 
} 

유효성 검사기는 passwordpasswordConfirm 일치하지 않을 때 예상대로 작동합니다.

org.hibernate.AssertionFailure: null id in com.test.User entry (don't flush the Session after an exception occurs) 

    at com.shopify.RegistrationController$_closure2.doCall(RegistrationController.groovy:14) 

    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 

    at java.lang.Thread.run(Thread.java:680) 

내가 user.save(flush: true)를 사용하여 내 엔티티를 지속하고있다 : 발리가 성공적으로 전달하고 인스턴스가 지속 되려고 할 때, 나는 다음과 같은 예외를 얻을.

내가 유효성 검사를 제거하면 내 인스턴스가 데이터베이스에 성공적으로 유지되므로 유효성 검사기에 문제가 있다고 가정합니다. 무엇이 잘못 되었을지에 대한 제안이 있습니까? Grails 버전 2.0.4를 사용하고 있습니다.

편집 :

def register = {  
    def user = new User(params) 
    if (!user.save(flush:true, failOnError:true)) { 
     render view: 'register', model: [userInstance: user] 
    } else { 
     render view: 'success' 
    } 
} 

편집 : 나는 다음과 같이 나의 실체가 저장 부분은 좋아, 난 봄 보안 코어에 의해 삽입 된 다음 코드를 주석으로이 작업을 관리 :

def beforeInsert() { 
    // encodePassword() 
} 

def beforeUpdate() { 
    // if (isDirty('password')) { 
    // encodePassword() 
    // } 
} 

현재로서는 왜 이런 일이 발생하는지 잘 모르겠지만이를 확인해 보겠습니다. 누군가가 이것에 대한 정보를 가지고 있다면, 나는 정말로 나와 공유하고 싶습니다.

편집 :이 관련 버그 리포트를 찾을 수 없음 : 당신의 사용자가 삽입하기 전에 사용자 암호를 해시 때문에 http://jira.grails.org/browse/GRAILS-9083

+0

더 자세한 오류 로그를 얻으려면 저장에 추가 할 수 있습니까? user.save (flush : true, failOnError : true) –

+0

동일한 작업 ... 추가 정보 없음. –

+0

obj를 저장하는 코드의 전체 부분을 게시 할 수 있습니까? user.save() 대신에 –

답변

0

검증이 실패 따라서 암호가 더 이상 유효성 검사 오류를 트리거링 passwordConfirm 같습니다.

여기에 당신이하고있는 작업은 다음과 같습니다 저장하기 전에

() : .save 동안

def password = 1234 
def passwordConfirm = 1234 
password == passwordConfirm validation passes 

(). 삽입 트리거되기 전에 :

쉬운 수정하지 도메인 개체 내에서 별도의 명령 개체의 유효성 검사를하고있을 것입니다

def password = 1234 
def passwordConfirm = 1234 
password == passwordConfirm validation passes but now you have your password in plain texts inside your DB, you should never do this for security reasons. 
그것은 자기의 :

def password gets hashed: 
def password = [email protected][email protected][email protected][email protected][email protected][email protected] 
def passwordConfirm = 1234 
password != passwordConfirm validation fails 

도메인에서 encodePassword()를 제거한 후 passwordConfirm은 도메인 클래스에 있지 않아야합니다.

예 : 스프링 보안 UI의 source을 살펴보고 컨트롤러에서 명령 개체를 사용하여 컨트롤러에서 유효성 검사를 처리하는 방법을 확인하십시오.

+0

유효성 검사 오류가 발생하지 않습니다. 예외가 발생합니다. 이것이 사실인지 확실하지 않습니다. –

+0

링크 된 해당 JIRA 티켓의 주석 섹션을 읽으면 실패한 유효성 검증 및 오류가 표시되지 않은 이유로 인한 것임을 알 수 있습니다. – 16dots

관련 문제