2012-03-15 21 views
11

Chúng tôi đang làm việc trên một dự án mới với Grails 2.0.1 và Spring Security. Ngữ cảnh tạo người dùng không thành công do springSecurityService trong đối tượng miền người dùng là null. Điều kỳ lạ này chỉ xảy ra trong hộp văn bản Linux của chúng tôi trong khi trên tất cả các hộp cửa sổ dành cho nhà phát triển, nó hoạt động tốt. Bạn không chắc chắn liệu nó có liên quan gì đến môi trường hay không. Trên hộp linux này không thành công.Null springSecurityService làm cho encodePassword thất bại trong Grails 2.0.1

Lớp miền người dùng mà chúng tôi đang sử dụng ở bên dưới (lớp được tạo bởi plugin có một vài trường bổ sung). EncodePassword đang được xử lý bởi các trigger beforeInsert(), beforeUpdate().

Đến chủ đề này nói về các tài liệu tham khảo tạm thời gây ra sự cố trong luồng web mà tôi cho là không được sử dụng tại đây, vì vậy không chắc liệu điều này có liên quan hay không. http://grails.1312388.n4.nabble.com/Spring-Security-Plugin-1-of-the-time-springSecurityService-null-td4349941.html

class User { 

    transient springSecurityService 

    static constraints = { 
     firstName blank: false, nullable: false, size: 2..100 
     lastName blank: false, nullable: false, size: 2..100 
     username blank: false, nullable: false, unique : true, email: true 
     password blank: false, nullable: false, size: 6..255 
    } 

    static mapping = { 
     password column: '`password`' 
    } 

    String username 
    String password 
    boolean enabled 
    boolean accountExpired 
    boolean accountLocked 
    boolean passwordExpired 

    /* user details */ 
    String firstName; 
    String lastName; 

    Set<Role> getAuthorities() { 
     UserRole.findAllByUser(this).collect { it.role } as Set 
    } 

    def beforeInsert() { 
     encodePassword() 
    } 

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

    protected void encodePassword() { 
     password = springSecurityService.encodePassword(password) 
    } 
} 

Cảm ơn trước

+1

Tôi không muốn sử dụng encodePassword trong phạm vi của người dùng, nhưng tại chỗ khi người dùng đã được tạo ra: điều khiển, dịch vụ, kiểm tra: new User (username: "root", mật khẩu: springSecurityService.encodePassword ('1')) Tôi không nghĩ rằng đây là cách giải quyết hoặc hack. –

+0

Sau đó, có một số cách để tạo một cá thể Người dùng mới mà không cần mã hóa mật khẩu của nó, vì người gọi không nhất thiết phải sử dụng encodePassword. Quyết định thiết kế này đảm bảo rằng mật khẩu luôn luôn được mã hóa khi miền người dùng được thao tác, từ một quan điểm bảo mật mạnh mẽ hơn. –

Trả lời

20

Bạn có thể sử dụng Groovy của meta-lập trình để ghi đè lên các phương pháp encodePassword nếu bạn chỉ muốn chắc chắn đối tượng người dùng được lưu lại và bạn không quan tâm đến mật khẩu cho thử nghiệm của bạn.

@TestFor(UserService)  
@Mock(User) 
class UserServiceTest { 
    void testMethod() { 
     User.metaClass.encodePassword = { -> } 

     service.invokeTestThatSavesUserDomainClass() 
    } 
} 
+0

Snap thật đơn giản. Chính xác những gì tôi đang tìm kiếm là mới để thử nghiệm và tất cả. Tôi đọc các giải pháp khác về điều này và các bài viết SO khác về vấn đề này, đây là giải pháp đơn giản nhất! – Quad64Bit

3

springSecurityService KHÔNG được tạm thời. Các mã sau đây nên làm việc

class User { 

    def springSecurityService 

    static transients = ["springSecurityService"] 

    protected void encodePassword() { 
     password = springSecurityService.encodePassword(password) 
    } 
} 
+0

Cú pháp OPs hoạt động với Grails 2.0+ cũng như điều này. –

Các vấn đề liên quan