2012-03-15 2 views
11

हम Grails 2.0.1 और वसंत सुरक्षा के साथ एक नई परियोजना पर काम कर रहे हैं। प्रयोक्ता डोमेन ऑब्जेक्ट में springSecurityService के कारण उपयोगकर्ता का संदर्भ शून्य विफल रहता है। आश्चर्यजनक रूप से यह केवल हमारे लिनक्स टेक्स्ट बॉक्स होता है जबकि सभी डेवलपर विंडोज बॉक्स पर यह ठीक काम करता है। सुनिश्चित नहीं है कि पर्यावरण के साथ इसका कोई संबंध नहीं है या फिर यह कुछ और है या नहीं। लिनक्स बॉक्स पर यह लगातार विफल रहता है।शून्य वसंत सुरक्षा सुरक्षा सेवा एन्कोड का कारण बनती है Grails में विफल होने के लिए 2.0.1

हम जिस उपयोगकर्ता डोमेन क्लास का उपयोग कर रहे हैं वह नीचे है (प्लगइन जेनरेट क्लास कुछ अतिरिक्त फ़ील्ड के साथ)। एन्कोड पासवर्ड को पहले() ट्रिगर से पहले, पहले इंसर्ट() द्वारा संभाला जा रहा है।

इस धागे में आया जो क्षणिक संदर्भों के बारे में बात करता है जो वेबफ्लो में समस्याएं पैदा करता है, जो मुझे लगता है कि यहां उपयोग नहीं किया जा रहा है, इसलिए यह सुनिश्चित नहीं है कि यह प्रासंगिक है या नहीं। 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) 
    } 
} 

अग्रिम

+1

मैं उपयोगकर्ता डोमेन encodePassword का उपयोग नहीं करना चाहते हैं, लेकिन जगह में जब उपयोगकर्ता बनाया जा रहा है: नियंत्रक, सेवा, परीक्षण: नया उपयोगकर्ता (उपयोगकर्ता नाम: "रूट", पासवर्ड: springSecurityService.encodePassword ('1')) मुझे नहीं लगता कि यह कामकाज या हैक है। –

+0

फिर अपना पासवर्ड एन्कोड किए बिना नया उपयोगकर्ता उदाहरण बनाने का कोई तरीका है, क्योंकि कॉलर को अनिवार्य रूप से एन्कोड पासवर्ड का उपयोग करना नहीं है। यह डिज़ाइन निर्णय यह सुनिश्चित करता है कि जब उपयोगकर्ता डोमेन का उपयोग किया जाता है तो पासवर्ड हमेशा एन्कोड किया जाता है, जो सुरक्षा दृष्टिकोण से अधिक मजबूत होता है। –

उत्तर

20

आप उपयोग कर सकते हैं चाहिए ग्रूवी के मेटा प्रोग्रामिंग encodePassword विधि ओवरराइड करने के लिए अगर आप केवल उपयोगकर्ता वस्तु सहेजा जाता है और आप अपने परीक्षण के लिए पासवर्ड के बारे में परवाह नहीं है यह सुनिश्चित करना चाहते।

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

     service.invokeTestThatSavesUserDomainClass() 
    } 
} 
+0

स्नैप जो सरल था। वास्तव में जो मैं परीक्षण और सभी के लिए नया होने के लिए देख रहा था। मैंने इस मुद्दे के बारे में अन्य समाधानों और अन्य एसओ पदों को पढ़ा है, यह अब तक का सबसे आसान समाधान है! – Quad64Bit

1

धन्यवाद मुझे पता है कि कि उपयोगकर्ता डोमेन वर्ग में इंजेक्ट किया जाता परीक्षण SpringSecurity सेवा के साथ कुछ समस्याएं हैं। इस प्रश्न पर एक नज़र डालें: How to test unit test controllers that use SpringSecurity service

3

springSecurityService क्षणिक नहीं होना चाहिए। निम्नलिखित कोड काम

class User { 

    def springSecurityService 

    static transients = ["springSecurityService"] 

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

ओपी सिंटैक्स Grails 2.0+ के साथ-साथ यह करता है। –

संबंधित मुद्दे