রেলগুলিতে সাবডোমেনগুলির মধ্যে সেশন (কুকিজ) ভাগ করবেন?


93

আমার একটি অ্যাপ সেটআপ রয়েছে যেখানে প্রতিটি ব্যবহারকারী কোনও সংস্থার অন্তর্গত এবং সেই সংস্থার একটি সাবডোমেন থাকে (আমি বেসক্যাম্প স্টাইলের সাবডোমেন ব্যবহার করছি)। আমি যে সমস্যার মুখোমুখি হচ্ছি তা হ'ল রেলগুলি একাধিক কুকিজ তৈরি করছে (একটি lvh.me এর জন্য এবং অন্যটি subdomain.lvh.me এর জন্য) যা আমার অ্যাপ্লিকেশনটিতে বেশ কয়েকটি বিরতি সৃষ্টি করছে (যেমন ফ্ল্যাশ বার্তাগুলি অবিচ্ছিন্ন থাকা সত্ত্বেও একবারে সমস্ত অনুরোধগুলি শেষ করে দেয়) সাইন ইন).

আমার /cofig/initilizer/session_store.rb ফাইলে এটি আছে:

AppName::Application.config.session_store :cookie_store, key: '_application_devise_session', domain: :all

ডোমেন:: গুগলে আমি খুঁজে পেয়েছি এমন সমস্ত স্ট্যান্ডার্ড উত্তর বলে মনে হচ্ছে তবে এটি আমার পক্ষে কাজ করছে বলে মনে হয় না। কোন সাহায্য প্রশংসা করা হয়!

উত্তর:


76

যেহেতু এটি 'ডোমেন: আউটস'-এ পরিণত হয় সেই অধিবেশন চলাকালীন পরিদর্শন করা সমস্ত পৃথক সাবডোমেনের জন্য একটি কুকি তৈরি করে (এবং এটি নিশ্চিত করে যে তারা অনুরোধের মধ্যে দিয়ে গেছে)। যদি কোনও ডোমেন যুক্তি পাস না করা হয় তবে এর অর্থ হ'ল একই সেশনে পরিদর্শন করা প্রতিটি ভিন্ন ডোমেনের জন্য একটি নতুন কুকি তৈরি করা হয় এবং পুরানোটি বাতিল হয়ে যায়। আমার যা দরকার তা হ'ল একক কুকি যা পুরো অধিবেশন জুড়েই স্থির থাকে, এমনকি ডোমেন পরিবর্তিত হয়েও। অতএব, পাসিং domain: "lvh.me"উন্নয়নের সমস্যার সমাধান করে। এটি একটি একক কুকি তৈরি করে যা সেখানে বিভিন্ন সাবডোমেনের মধ্যে থাকে।

যে কারও আরও ব্যাখ্যা প্রয়োজন, এটি একটি দুর্দান্ত লিঙ্ক: http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/


4
থ্যাঙ্কস ডুড .. আমি আমার একটি প্রকল্পে এই সমস্যাটির মুখোমুখি হয়েছি .. অবশেষে সমাধানটি খুঁজে পেয়েছি ..
শিরজিল আলম

4
আপনার config.secret_key_baseসমস্ত অ্যাপ্লিকেশন জুড়ে একই ব্যবহার নিশ্চিত করুন , অন্যথায় এটি কুকিটি ডিকোড করতে সক্ষম হবে না।
ব্রুনো বুক্কোলো

6
আমি 4 টি রেলের জন্য এটি সম্পর্কিত কোনও প্রশ্ন দেখতে পাচ্ছি না আপনি কি জানেন যে এটি পরিবর্তন হয়েছে কিনা। আমি আমার প্রকল্পের সাথে এটি কাজ করতে পারি না। এটি কুকিজ পুনরুদ্ধার করতে থাকে। ধন্যবাদ
অ্যান্ডি

আমি যদি CacheStoreমেমক্যাচে সেশনগুলি সঞ্চয় করতে ব্যবহার করতে চাই ?
অমিত প্যাটেল

4
রেলস 4 সহ, আমি দেখতে পেয়েছি যে এটি কেবল ড্যাশযুক্ত সাবডোমেনগুলির জন্য কাজ করেছে তবে আন্ডারস্কোরগুলির সাথে নয়:Appname::Application.config.session_store :cookie_store, key: '_appname_session', domain: :all, tld_length: 2
ব্যবহারকারী 1515295

68

http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/

"আপনি যে অংশটি এখানে সন্ধান করতে চান তা হ'ল: আপনি যদি ডোমেইন =>: কিছু নির্দিষ্ট জায়গায় সেট করার পরামর্শ দেন তবে আপনি লোকালহোস্ট ব্যবহার না করলে এটি কার্যকর হবে না:: টিএলডি দৈর্ঘ্যের 1 ডিফল্ট সমস্ত ডিফল্ট যার অর্থ আপনি যদি পাও (মায়াপ.দেব) দিয়ে পরীক্ষা করে থাকেন তবে তা কাজ করবে না কারণ এটি দৈর্ঘ্যের 2 টিএলডি। "

অন্য কথায় আপনার প্রয়োজন:

 App.config.session_store ... , :domain => :all, :tld_length => 2

আপনার কুকিজ সাফ করার জন্য একটি ভাল ধারণা


4
এটি সর্বোত্তম উত্তর কারণ এক পরিবর্তন সমস্ত পরিবেশে (app.com এবং app.dev) কাজ করে। কাস্টম মিডলওয়্যার প্রয়োজন হয় না। কুকিজ সাফ করার জন্য ভাল পয়েন্ট!
তুরাদগ

4
আপনি নিখোঁজ রয়েছেন, :tld_length => 2
মনট্রিমালিক

4
আপনার config.secret_key_baseসমস্ত অ্যাপ্লিকেশন জুড়ে একই ব্যবহার নিশ্চিত করুন , অন্যথায় এটি কুকিটি ডিকোড করতে সক্ষম হবে না।
ব্রুনো বুক্কোলো

4
:domain => :all4 রেলগুলিতে কাজ করবে না, চেষ্টা করুন domain => 'lvh.me', tld_length = 2। এটি আমার জন্য কাজ করেছিল
মিন

4
Ails.২ রেলগুলির সাথে ডোমেনটি domain: :all, tld_length: 2ব্যবহার করার সময় আমি ভাল ফলাফল পেয়েছি lvh.me
জুইপ্পি

24

আমি স্পষ্টভাবে ডোমেন নামটি উল্লেখ না করেই এই সমস্যা সমাধানের একটি উপায় খুঁজছিলাম, তাই আমি লোকালহোস্ট, lvh.me এবং যে কোনও ডোমেনের মধ্যে সেশন_স্টোর.আরবি ফাইলটি সম্পাদনা না করেই প্রোডাক্টে ব্যবহার করতে পারি তার মধ্যে হ্যাপ করতে পারি। তবে, "ডোমেন:: সমস্ত" সেট করা আমার পক্ষে কাজ করছে বলে মনে হয় না।

শেষ পর্যন্ত আমি দেখতে পেলাম যে এই অভিব্যক্তিতে আমার tld_leth (শীর্ষ স্তরের ডোমেন দৈর্ঘ্য) বর্ণনা করা দরকার। ডিফল্ট tld_leth 1 হয় উদাহরণস্বরূপ.lvh.me এর tld_leth 2 এবং 127.0.0.1.xip.io এর একটি tld_leth 5 থাকে, উদাহরণস্বরূপ। সুতরাং আমি ডেভেলপমেন্টে lvh.me এর সাবডোমেনগুলির জন্য সেশন_স্টোর.আরবি ফাইলটিতে যা ছিল এবং যা কিছু উত্পাদনে ছিল তা নীচে ছিল।

MyApp::Application.config.session_store :cookie_store, key: '_MyApp_session', domain: :all, tld_length: 2

আশা করি এটি কাউকে সাহায্য করবে, কারণ এই উত্তরটি খুঁজতে আমার অনেক সময় লেগেছে!


19

কোনও কারণে :allডোমেনের সাথে প্রতিস্থাপন করা আমার পক্ষে কাজ করে নি (রেল 3.2.11)। এটি ঠিক করার জন্য এটি কাস্টম মিডলওয়্যারের একটি অংশ নিয়েছিল। নীচের সমাধানের সংক্ষিপ্তসারটি নীচে।

tl; dr: আপনাকে একটি কাস্টম র্যাক মিডলওয়্যার লিখতে হবে। আপনার এটিতে আপনার যুক্ত হওয়া দরকার conifg/environments/[production|development].rb। এটি ails.২.১১ এর কারাগারে রয়েছে

কুকি সেশনগুলি সাধারণত আপনার শীর্ষ স্তরের ডোমেনের জন্য সংরক্ষণ করা হয়।

আপনি তাকান Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}আপনি দেখতে পারেন যে জন্য পৃথক এন্ট্রি হতে হবে sub1.yourdomain.comএবং othersub.yourdomain.comএবংyourdomain.com

চ্যালেঞ্জটি হ'ল সমস্ত সাবডমাইনগুলিতে একই সেশন স্টোর ফাইলটি ব্যবহার করা।

পদক্ষেপ 1: কাস্টম মিডলওয়্যার ক্লাস যুক্ত করুন

রাক মিডলওয়্যারটি এখানেই আসে Some কিছু প্রাসঙ্গিক র্যাক এবং রেলের সংস্থানগুলি:

এখানে একটি কাস্টম শ্রেণি রয়েছে যা আপনার এতে যোগ করা উচিত lib এটি @ ন্যাডার লিখেছিলেন এবং আপনারা সবাই তাকে ধন্যবাদ জানাতে হবে

# Custom Domain Cookie
#
# Set the cookie domain to the custom domain if it's present
class CustomDomainCookie
  def initialize(app, default_domain)
    @app = app
    @default_domain = default_domain
  end

  def call(env)
    host = env["HTTP_HOST"].split(':').first
    env["rack.session.options"][:domain] = custom_domain?(host) ? ".#{host}" : "#{@default_domain}"
    @app.call(env)
  end

  def custom_domain?(host)
    host !~ /#{@default_domain.sub(/^\./, '')}/i
  end
end

মূলত এটি যা করে তা হ'ল এটি আপনার সমস্ত কুকি সেশন ডেটা ম্যাপ করবে ঠিক একই কুকি ফাইলটিতে যা আপনার রুট ডোমেনের সমান।

পদক্ষেপ 2: রেলগুলিতে কনফিগার করুন

এখন আপনার লিবিতে একটি কাস্টম ক্লাস রয়েছে, এটি স্বয়ংক্রিয়ভাবে চালিয়ে যাচ্ছেন তা নিশ্চিত করুন। যদি এটি আপনার কাছে কিছুই বোঝায় না, তবে এখানে দেখুন: 3 টি গাড়ি চালানো ails

প্রথম জিনিসটি হ'ল আপনি কোনও কুকির স্টোর ব্যবহার করে সিস্টেম-ওয়াইড কিনা তা নিশ্চিত করা। ইন config/application.rbআমরা একটি কুকিজ সঞ্চয় ব্যবহার করতে পাগল বলুন।

# We use a cookie_store for session data
config.session_store :cookie_store,
                     :key => '_yourappsession',
                     :domain => :all

এখানে এখানে উল্লেখ করার কারণটি :domain => :allলাইনটির কারণে । অন্যান্য লোকেরা :domain => ".yourdomain.com"পরিবর্তে নির্দিষ্ট করার পরামর্শ দিয়েছেন :domain => :all। কিছু কারণে এটি আমার পক্ষে কার্যকর হয়নি এবং উপরে বর্ণিত হিসাবে কাস্টম মিডলওয়্যার ক্লাসের আমার প্রয়োজন ছিল।

তারপরে আপনার config/environments/production.rbঅ্যাডে:

config.middleware.use "CustomDomainCookie", ".yourdomain.com"

উল্লেখ্য পূর্ববর্তী বিন্দুটি প্রয়োজনীয় is "দেখ উপ-ডোমেইন কুকিজ, একটি পিতা বা মাতা ডোমেইন অনুরোধ? পাঠানো " কেন জন্য।

তারপরে আপনার config/environments/development.rbঅ্যাডে:

config.middleware.use "CustomDomainCookie", ".lvh.me"

Lvh.me কৌশল লোকালহোস্টে মানচিত্র onto এটা অসাধারণ. দেখুন সাবডোমেন সম্পর্কে এই Railscast এবং এই নোটটি আরও তথ্যের জন্য।

আশা করি এটি করা উচিত। আমি আন্তরিকভাবে পুরোপুরি নিশ্চিত নই যে প্রক্রিয়াটি কেন এই সংঘাতযুক্ত, কারণ আমি মনে করি ক্রস সাবডোমেন সাইটগুলি সাধারণ। কারও কাছে যদি এই পদক্ষেপগুলির প্রতিটিের পিছনে কারণ সম্পর্কে আরও অন্তর্দৃষ্টি থাকে, তবে আমাদের মন্তব্যগুলিতে আলোকিত করুন।


একাধিক শীর্ষ স্তরের ডোমেন দিয়ে এই কাজ করার কোনও উপায় আছে? আমার একটি পণ্য রয়েছে যা বিভিন্ন দেশে চলে। এখানে আমরা ধরে নিচ্ছি যে ডিফল্ট ডোমেনটি আপনারডোমেন.কম, তবে এটি যদি .be .sv .fr .com.br .com.ar এবং অন্যদের জন্য কাজ করার কথা ছিল? ধন্যবাদ
মার্ক লায়েঞ্জ

আমি এই কাজ করতে পারি না। আমি রেল 4 তে উন্নতি করছি এবং মনে হচ্ছে রিয়ালগুলি কেবলমাত্র উপরের সমস্ত কোড উপেক্ষা করে। এটি কেবলমাত্র সাবডোমেনগুলি জুড়ে সেশনটি ভাগ করতে চায় না।
ওলে হেনরিক স্কোগ্রস্টম

@ OleHenrikSkogstrøm আপনার config.secret_key_baseসমস্ত অ্যাপ্লিকেশন জুড়ে একই ব্যবহার নিশ্চিত করুন , অন্যথায় এটি কুকিটি ডিকোড করতে সক্ষম হবে না।
ব্রুনো বুক্কোলো

17

কুকিটিকে রুট ডোমেন হিসাবে সেট করার সহজতম উপায় সন্ধান করার সময় আমি এটি পেরিয়ে এসেছি। মনে :allহয় ডোমেন বিকল্প হিসাবে পাস করার পরে বিকল্পটি সম্পর্কে কিছু ভুল তথ্য রয়েছে । অধিকাংশ ডোমেনের জন্য, এটি আসলে আশানুরূপ কাজ করবে (যেমন রুট ডোমেন কুকি সেট .example.comজন্য test.example.com)। আমি মনে করি যেহেতু বেশিরভাগ লোকেরা lvh.meপরীক্ষার জন্য ডোমেনটি ব্যবহার করছেন সেহেতু তারা সমস্যার সম্মুখীন হয়েছে । শীর্ষ স্তরের ডোমেন খুঁজতে রেল দ্বারা ব্যবহৃত রেজেক্সকে সংজ্ঞায়িত করা হয়েছে DOMAIN_REGEXP = /[^.]*\.([^.]*|..\...|...\...)$/। আপনি যদি শেষ অংশটি লক্ষ্য করেন তবে দেখতে পাবেন যে রেলগুলি lvh.meটিএলডি এর অনুরূপ ব্যাখ্যা করে com.au। যদি আপনার ব্যবহারের ক্ষেত্রে lvh.meকাজ করার প্রয়োজন হয় তবে :allবিকল্পটি সঠিকভাবে কাজ করবে না, তবে এটি বেশিরভাগ ডোমেনের জন্য সহজ এবং সর্বোত্তম বিকল্প বলে মনে হয়।

টি এল; ডিআর, সঠিক উত্তরটি এখানে, আপনি অভিমানী একটি 3 অক্ষর ডোমেইন (বা কোনো ডোমেন বিভ্রান্ত উপরে Regex) হল ব্যবহার করার জন্য উন্নয়নশীল নেই :all


আপনাকে ধন্যবাদ, শেষ পর্যন্ত এটি আমাকে বুঝতে সাহায্য করেছিল যে এত উত্তরগুলি 2 এর একটি tld_ দৈর্ঘ্যের প্রস্তাব দিচ্ছিল তবে কেন আমার দরকার নেই!
স্যুপডগ

এই উত্তরটি উচ্চতর হওয়া দরকার। ধন্যবাদ স্যার.
luca.busin

"lvh.me com.au এর অনুরূপ একটি টিএলডি হিসাবে" "বিটিডাব্লু রেলসকে অবশ্যই একটি দেশ ডোমেন (মন্টিনিগ্রো) হিসাবে একইভাবে ব্যাখ্যা করা উচিত।
মাহেমফ

8

Ails.x রেল (5/ails সংস্করণেও জরিমানা করা উচিত)

কীভাবে lvh.me:3000 এবং লোকালহোস্টে (সাবস্ক্রাইব) সাবডোমেন পাবেন

বিকাশ: আমি এতে যুক্ত করার .lvh.meজন্য কুকিগুলি ভাগ করে নিয়েছি session_store.rb,

এটা তোলে স্থানীয় হোস্ট উপর সাবডোমেন মধ্যে ভাগ করা হবে admin.lvh.me:3000, lvh.me:3000এবং তাই ...

#config/initializers/session_store.rb

domain = Rails.env.production? ? ".domain_name.com" : ".lvh.me"

Rails.application.config.session_store :cookie_store, 
                      key: '_app_name_session', domain: domain

4

তুমি কি চেষ্টা করেছিলে

AppName::Application.config.session_store :cookie_store, key: '_application_devise_session', domain: 'lvh.me'  

)

মূলত আমরা বলছি বেস ডোমেনের জন্য একক কুকি আছে এবং কেবল সাব ডোমেনটিকে উপেক্ষা করুন ... যদিও এই পদ্ধতির এখনও কিছু ত্রুটি রয়েছে ...


2

সমর্থন রেল 5

যদি আপনি চান এটি কোনও ডোমেনের সাথে কাজ করে:

Rails.application.config.session_store :cookie_store, key: '_my_app_session', domain: :all, tld_length: 2

প্রতি পরিবেশ কনফিগার করতে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

Rails.application.config.session_store :cookie_store, key: '_my_app_session', domain: {
  production: '.example.com',
  development: '.example.dev'
}.fetch(Rails.env.to_sym, :all)

রেফ: https://github.com/plataformatec/devise/wiki/How-To:- ব্যবহার- সাবডোমেনস


0

আপনি যদি সেশন স্টোরের জন্য রেডিস ব্যবহার করছেন।

if Rails.env.development?
    Rails.application.config.session_store :redis_store, {
       servers: [
        { host: 'localhost', port: 6379},
      ],
      key: '_app_session',
      expire_after: 1.day,
      domain: :all
    }

else
    Rails.application.config.session_store :redis_store, {
       servers: [
        { host: HOST_URL, port: PORT},
      ],
      key: '_app_session',
      expire_after: 1.day,
      domain: '.domain.com',
      tld_length: 2
    }
    
end 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.