2010-10-08 7 views
13

मैं अपने रेल ऐप में प्रमाणीकरण के लिए डेविस का उपयोग कर रहा हूं और मैं कुछ खातों को अवरुद्ध करने में सक्षम होना चाहता हूं और उपयोगकर्ताओं को अवरुद्ध ईमेल के साथ पुनः पंजीकरण करने से रोकना चाहता हूं। मुझे यकीन नहीं है कि इसके बारे में क्या सबसे अच्छा तरीका है।रेल के लिए देवताओं के साथ उपयोगकर्ताओं को प्रतिबंधित/अवरुद्ध करने का सबसे अच्छा तरीका क्या है?

मेरा पहला विचार सत्र और रजिस्ट्रेशन नियंत्रकों को एक अवरुद्ध बिट वाले उपयोगकर्ता के लिए मॉडल की जांच करने के लिए ओवरराइड करना था, लेकिन मुझे लगता है कि एक और अधिक शानदार तरीका हो सकता है।

उत्तर

11

मैं इस तरह यह करना होगा:

def after_sign_in_path_for(resource) 
    if resource.is_a?(User) && resource.banned? 
    sign_out resource 
    banned_user_path 
    else 
    super 
    end 
end 
+2

ध्यान दें कि इसमें कमजोरी है: यदि उपयोगकर्ता पहले से लॉग इन होने पर प्रतिबंधित है, तो प्रतिबंध तब तक प्रभावी नहीं होगा जब तक कि वे साइन आउट न करें और फिर से साइन इन न करें (जो लंबे समय तक हो सकता है।) तो या तो बल जब आप उन्हें प्रतिबंधित करते हैं, उस समय लॉग आउट करने के लिए उपयोगकर्ता, या इस तर्क को 'after_sign_in_path_for'' के बजाय अपने नियंत्रकों में 'pre_action' पर ले जाएं। – GMA

+1

जब आप उपयोगकर्ता को प्रतिबंधित करते हैं, तो उसे – enter08

0

आप उपयोगकर्ता मॉडल, में एक custom validation method बना सकते हैं जो, पर बनाने के लिए, जाँच करता है कि ईमेल ईमेल के अवरुद्ध सूची में है।

2

एक और अधिक सुरुचिपूर्ण दृष्टिकोण (उपयोगकर्ता) नियंत्रक की find_for_authentication विधि को ओवरराइड करना है, इसे केवल अनब्लॉक किए गए उपयोगकर्ताओं के लिए स्कॉइंग करना है। इस तरह, अवरुद्ध उपयोगकर्ता के रूप में लॉग इन करने का प्रयास करना ऐसे उपयोगकर्ता के रूप में लॉग इन करने का प्रयास करना है जो अस्तित्व में नहीं है। (आप उपयोगकर्ता वह ब्लॉक किया गया है बताने के लिए चाहते हैं, आप एक फ्लैश चेतावनी यहाँ भी सेट कर सकते हैं Here's a good run-through

5

एक बेहतर समाधान active_for_authentication वसीयत मॉडल पर विधि (उपयोगकर्ता) ओवरराइड करने के लिए तो जैसा है:।।?।

def active_for_authentication? 
     super && !self.banned? 
    end 
20

सबसे अच्छा तरीका वसीयत रास्ता में यह करने के लिए है:।

नीचे मानता है कि आप और database_authenticable मॉड्यूल वसीयत का उपयोग कर रहे अपने आवेदन के उपयोगकर्ताओं मॉडल नाम उपयोगकर्ता

1. खाता_active लागू करें? विधि।

उपयोगकर्ता तालिका में बूलियन account_active कॉलम जोड़ें या उपयोगकर्ता मॉडल में account_active? विधि को परिभाषित करें (आप अपना स्वयं का विधि नाम चुन सकते हैं)। उदाहरण के लिए:

# app/models/user.rb 
    def account_active? 
     blocked_at.nil? 
    end 

2. अपने मॉडल (उपयोगकर्ता) में active_for_authentication? विधि ओवरराइट करें।

# app/models/user.rb 
    def active_for_authentication? 
     super && account_active? 
    end 

3. जोड़ें विधि है जो फ्लैश संदेश के लिए अनुवाद देता है।

जब भी active_for_authentication? झूठा रिटर्न देता है, तो देवसे inactive_message विधि का उपयोग कर आपका मॉडल निष्क्रिय क्यों है, इस कारण से पूछता है।

# app/models/user.rb 
    def inactive_message 
     account_active? ? super : :locked 
    end 

और यही वह है। आपको sign_out या redirect_to उपयोगकर्ता की देखभाल करने की आवश्यकता नहीं है।

इसके अलावा, उपयोगकर्ता तुरंत बंद कर दिया जाता है, अगले अनुरोध के साथ, अगले साइन इन करने के बाद नहीं

अधिक:। devise/authenticatable.rb

+0

पर लॉग इन करने के लिए बस एक और पंक्ति जोड़ें, कृपया बताएं कि प्रत्येक कोड ब्लॉक के लिए प्रत्येक फ़ाइल क्या है? –

+1

@AymanSalah अनुरोध के रूप में किया। सभी तीन तरीकों को 'ऐप/मॉडल/user.rb' में रखा जाना चाहिए (मान लीजिए कि user.rb आपका मॉडल एप्लिकेशन के उपयोगकर्ताओं के लिए ज़िम्मेदार है) – sampi

+0

धन्यवाद मेरे बहुत सारे आदमी। आपका जवाब वास्तव में सहायक था। –

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

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