2011-06-23 18 views
5

के साथ मुलायम हटाए गए उपयोगकर्ता के लॉगिन को कैसे रोकें मैं वर्तमान में रेल परियोजना में उपयोगकर्ता पंजीकरण/प्रमाणीकरण के लिए डेविस का उपयोग करता हूं। जब कोई उपयोगकर्ता अपना खाता रद्द करना चाहता है, तो उपयोगकर्ता ऑब्जेक्ट को निम्न तरह से नरम हटा दिया जाता है।डेविस

How to "soft delete" user with Devise

मेरे implmenetation एक छोटा सा फर्क इस तरह से है। उपयोगकर्ता मॉडल में 'delete_flag' विशेषता है। और, soft_delete विधि निष्पादित करता है "update_attribtue (: delete_flag, true)"

लेकिन, मुझे साइन_इन क्रिया लागू करना है। मेरे इम्प्लेमेनेटेशन में निम्नलिखित है।

class SessionsController < Devise::SessionsController 
    def create 
    resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")  

    if resource.deleted_flag 
     p "deleted account : " + resource.deleted_flag.to_s 
     sign_out(resource) 
     render :controller => :users, :action => :index 
    else 
     if is_navigational_format? 
     if resource.sign_in_count == 1 
      set_flash_message(:notice, :signed_in_first_time) 
     else 
      set_flash_message(:notice, :signed_in) 
     end 
     end 
     sign_in(resource_name, resource) 
     respond_with resource, :location => redirect_location(resource_name, resource) 
    end 
    end 
end 

मुझे लगता है कि इस कोड में अजीब अंक हैं।

यदि हटाया गया उपयोगकर्ता गायन करने का प्रयास करता है, सिस्टम परमिट लॉगिंग और तुरंत लॉग आउट करें। और, सिस्टम फ्लैश प्रदर्शित नहीं कर सकता [: चेतावनी] संदेश ...

मैं दो बिंदु जानना चाहता हूं।

  1. हटाए गए उपयोगकर्ताओं को लॉगिन करने के लिए प्रतिबंधित करने के लिए मैं कैसे कार्यान्वित करूं?
  2. हटाए गए उपयोगकर्ता लॉगिन करने का प्रयास करते समय फ्लैश [: अलर्ट] प्रदर्शित करने के लिए मैं कैसे कार्यान्वित करूं?

उत्तर

0

मैं ऐसा कुछ प्रयास नहीं किया है लेकिन ऐसा लगता है अगर आप उपयोगकर्ता प्रमाणीकरण इससे पहले कि आप या तो एक वसीयत प्रमाणीकरण रणनीति या एक before_filterauthenticate_user! से पहले चलाने के लिए लिखने के लिए होगा पकड़ने के लिए चाहते हैं। कुछ ऐसा:

before_filter :no_deleted_users 

def no_deleted_users 
    if User.find(params[:email]).deleted? 
    redirect_to root_path, :flash => { :error => "Your user was deleted. You cannot log in." } 
    end 
end 

हालांकि उपयोगकर्ता इससे अधिक जटिल हो सकता है। मैंने डेविस प्री-प्रमाणीकरण के साथ नहीं खेला है।

9

किसी ऐसे उपयोगकर्ता को रोकने के लिए जिसे 'सॉफ्ट हटाया गया' है, तो सबसे अच्छा तरीका उपयोगकर्ता मॉडल पर find_for_authentication क्लास विधि को ओवरराइट करना है। जैसे:

Class User < ActiveRecord::Base 
    def self.find_for_authentication(conditions) 
    super(conditions.merge(:deleted_flag => false)) 
    end 

इस वसीयत के द्वारा एक अवैध ईमेल या पासवर्ड फ़्लैश संदेश उत्पन्न होगा (क्योंकि यह प्रमाणित करने के लिए उपयोगकर्ता नहीं मिल सकता है)

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

+2

कृपया यह भी देखें http://stackoverflow.com/q/8107966/249760 - जो वास्तव में उपयोगकर्ताओं के हस्ताक्षर को रोकने के साथ-साथ वर्तमान सत्रों को लात मारने दोनों को पूरा करता है। –

1

मेरा समाधान यहां देखें: https://stackoverflow.com/a/24365051/556388 असल में आपको सक्रिय_for_ प्रमाणीकरण को ओवरराइड करने की आवश्यकता है? तैयार मॉडल (उपयोगकर्ता) पर विधि।