জ্যাঙ্গোতে নিষ্ক্রিয়তার কারণে অধিবেশন কীভাবে শেষ হবে?


97

আমাদের জাজানো অ্যাপ্লিকেশনটির নিম্নলিখিত সেশন পরিচালনার প্রয়োজনীয়তা রয়েছে।

  1. ব্যবহারকারী ব্রাউজারটি বন্ধ করলে সেশনগুলির মেয়াদ শেষ হয়।
  2. নিষ্ক্রিয়তার একটি সময় পরে সেশনগুলির মেয়াদ শেষ হবে।
  3. নিষ্ক্রিয়তার কারণে যখন একটি সেশনটির মেয়াদ শেষ হয় তখন সনাক্ত করুন এবং ব্যবহারকারীকে উপযুক্ত বার্তা প্রদর্শন করুন।
  4. নিষ্ক্রিয়তার সময়কালের সমাপ্তির কয়েক মিনিট আগে ব্যবহারকারীদের আসন্ন অধিবেশনটির মেয়াদ শেষ হওয়ার বিষয়ে সতর্ক করুন। সতর্কতা সহ, ব্যবহারকারীদের তাদের সেশনটি বাড়ানোর জন্য একটি বিকল্প সরবরাহ করুন।
  5. যদি ব্যবহারকারী অ্যাপ্লিকেশনটির মধ্যে দীর্ঘ ব্যবসায়িক ক্রিয়াকলাপে কাজ করে যা সার্ভারে প্রেরণ করার অনুরোধ জড়িত না, সেশনটির সময়সীমা শেষ হওয়া উচিত নয়।

ডকুমেন্টেশন, জ্যাঙ্গো কোড এবং এটি সম্পর্কিত কিছু ব্লগ পোস্ট পড়ার পরে, আমি নিম্নলিখিত বাস্তবায়ন পদ্ধতির সাথে উপস্থিত হয়েছি।

প্রয়োজনীয়তা 1
এই প্রয়োজনটি সহজেই SESSION_EXPIRE_AT_BROWSER_CLOSE সত্য এ সেট করে প্রয়োগ করা হয়।

প্রয়োজনীয়তা 2
আমি অধিবেশনটির মেয়াদ শেষ হওয়ার সময়কাল সেট করতে SESSION_COOKIE_AGE ব্যবহার করার জন্য কয়েকটি সুপারিশ দেখেছি। তবে এই পদ্ধতিতে নিম্নলিখিত সমস্যা রয়েছে।

  • ব্যবহারকারী সক্রিয়ভাবে অ্যাপ্লিকেশনটি ব্যবহার করছেন এমনকি সেশনটি SESSION_COOKIE_AGE শেষে সর্বদা শেষ হয়। (প্রতিটি কাস্টম মিডলওয়্যার ব্যবহার করে প্রতিটি অনুরোধে SESSION_COOKIE_AGE এ সেশনটির মেয়াদ নির্ধারণ করে বা প্রতিটি অনুরোধে সেশনটি সংরক্ষণ করে SESSION_SAVE_EVERY_REQUEST টি সত্য হিসাবে সেট করে এটি প্রতিরোধ করা যেতে পারে But তবে পরবর্তী সমস্যাটি SESSION_COOKIE_AGE ব্যবহারের কারণে অনিবার্য।)

  • কুকিগুলি যেভাবে কাজ করে তার কারণে, SESSION_EXPIRE_AT_BROWSER_CLOSE এবং SESSION_COOKIE_AGE পারস্পরিক একচেটিয়া অর্থাৎ কুকি ব্রাউজারের নিকটে বা নির্দিষ্ট মেয়াদোত্তীনের সময় শেষ হয়। যদি SESSION_COOKIE_AGE ব্যবহার করা হয় এবং কুকির মেয়াদ শেষ হওয়ার আগে ব্যবহারকারী ব্রাউজারটি বন্ধ করে দেয়, কুকিটি ধরে রাখা হয় এবং ব্রাউজারটি পুনরায় খোলার ফলে ব্যবহারকারীকে (বা অন্য কেউ) পুনরায় প্রমাণীকরণ না করে সিস্টেমে অনুমতি দেয়।

  • জাজানো সেশনটি সক্রিয় কিনা তা নির্ধারণ করতে কেবল কুকি উপস্থিত থাকার উপর নির্ভর করে। এটি অধিবেশন সঞ্চিত অধিবেশন মেয়াদ শেষ হওয়ার তারিখটি পরীক্ষা করে না।

নিম্নলিখিত পদ্ধতিটি এই প্রয়োজনীয়তাটি প্রয়োগ করতে এবং উপরে বর্ণিত সমস্যাগুলি সমাধানের জন্য ব্যবহার করা যেতে পারে।

  • SESSION_COOKIE_AGE সেট করবেন না।
  • প্রতিটি অনুরোধে সেশনটির মেয়াদ শেষ হওয়ার তারিখটিকে 'বর্তমান সময় + নিষ্ক্রিয়তার সময়কাল' হিসাবে সেট করুন।
  • সেশনমিডলওয়্যারের প্রসেস_ের অনুরোধকে ওভাররাইড করুন এবং সেশনের মেয়াদ শেষ হওয়ার জন্য পরীক্ষা করুন। সেশনটির মেয়াদ শেষ হয়ে গেলে তা বাতিল করুন।

প্রয়োজনীয়তা 3
যখন আমরা সনাক্ত করি যে অধিবেশনটির মেয়াদ শেষ হয়ে গেছে (উপরের কাস্টম সেশনমিটলওয়ারে), সেশনটির মেয়াদ শেষ হওয়ার অনুরোধ করার অনুরোধটিতে একটি বৈশিষ্ট্য সেট করুন। এই বৈশিষ্ট্যটি ব্যবহারকারীর জন্য উপযুক্ত বার্তা প্রদর্শন করতে ব্যবহার করা যেতে পারে।

প্রয়োজনীয়তা 4
ব্যবহারকারীর নিষ্ক্রিয়তা সনাক্ত করতে জাভাস্ক্রিপ্ট ব্যবহার করুন, সতর্কতা প্রদান করুন এবং সেশনটি বাড়ানোর জন্য একটি বিকল্পও দিন। যদি ব্যবহারকারী প্রসারিত করতে চান তবে সেশনটি বাড়ানোর জন্য সার্ভারে একটি জীবন্ত পালস রাখুন।

প্রয়োজনীয়তা 5
ব্যবহারকারীর ক্রিয়াকলাপ সনাক্তকরণের জন্য জাভাস্ক্রিপ্ট ব্যবহার করুন (দীর্ঘ ব্যবসায়িক ক্রিয়াকলাপের সময়) এবং সেশনটির মেয়াদ শেষ হতে আটকাতে সার্ভারে জীবন্ত ডালগুলি প্রেরণ করুন।


উপরোক্ত বাস্তবায়ন পদ্ধতির বিষয়টি খুব বিস্তৃত বলে মনে হচ্ছে এবং আমি ভাবছিলাম যে কোনও সহজ পদ্ধতি থাকতে পারে (বিশেষত প্রয়োজন 2 এর জন্য)।

যে কোনও অন্তর্দৃষ্টি অত্যন্ত প্রশংসা করা হবে।


4
বিস্তারিত সমাধান সরবরাহের জন্য +1
ডন

একটি মিডওয়্যার রয়েছে যা আপনার প্রয়োজন অনুযায়ী করতে পারে। GitHub উপর এবং উপর pypi
gbutler

4
"কুকিগুলি যেভাবে কাজ করে তার কারণে, SESSION_EXPIRE_AT_BROWSER_CLOSE এবং SESSION_COOKIE_AGE পারস্পরিকভাবে একচেটিয়া হয় কুকি ব্রাউজারের নিকটে বা নির্দিষ্ট মেয়াদোত্তীনের সময় শেষ হয় S যদি SESSION_COOKIE_AGE ব্যবহার করা হয় এবং কুকিটির মেয়াদ শেষ হওয়ার আগে ব্যবহারকারী ব্রাউজারটি বন্ধ করে দেয় এবং কুকিটি পুনরায় চালু হয় ব্রাউজারটি ব্যবহারকারীকে (বা অন্য কেউ) পুনরায় প্রমাণীকরণ না করে সিস্টেমে অনুমতি দেবে। " আমি ভুল হলে আমাকে সংশোধন করুন, তবে এটি নতুন জ্যাঙ্গো সংস্করণগুলিতে আর সত্য বলে মনে হয় না? (1.5+ কমপক্ষে)
বটন্ড ব্রেস

4
"জাজানো অধিবেশন সক্রিয় কিনা তা নির্ধারণ করতে কেবল কুকি উপস্থিত থাকার উপর নির্ভর করে। এটি অধিবেশন সঞ্চিত অধিবেশন মেয়াদ শেষ হওয়ার তারিখটি যাচাই করে না।" এটি আর সত্য নয়।
ন্যাপেরেক

উত্তর:


44

এখানে একটি ধারণা ... SESSION_EXPIRE_AT_BROWSER_CLOSEসেটিংটি বন্ধ করে ব্রাউজারে সেশনটির মেয়াদ শেষ করুন । তারপরে প্রতিটি অনুরোধে সেশনটিতে একটি টাইমস্ট্যাম্প সেট করুন।

request.session['last_activity'] = datetime.now()

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

from datetime import datetime
from django.http import HttpResponseRedirect

class SessionExpiredMiddleware:
    def process_request(request):
        last_activity = request.session['last_activity']
        now = datetime.now()

        if (now - last_activity).minutes > 10:
            # Do logout / expire session
            # and then...
            return HttpResponseRedirect("LOGIN_PAGE_URL")

        if not request.is_ajax():
            # don't set this for ajax requests or else your
            # expired session checks will keep the session from
            # expiring :)
            request.session['last_activity'] = now

তারপরে সেশনটির মেয়াদ শেষ হওয়ার সাথে সম্পর্কিত এজ্যাক্স কলগুলিতে প্রাসঙ্গিক ডেটা ফেরত দিতে আপনাকে কিছু url এবং মতামত তৈরি করতে হবে।

যখন ব্যবহারকারী অধিবেশনটি "পুনর্নবীকরণ" করতে পছন্দ করেন, তাই বলতে গেলে আপনাকে যা করতে হবে তা requeset.session['last_activity']আবার বর্তমান সময়টিতে সেট করা আছে

স্পষ্টতই এই কোডটি কেবল একটি শুরু ... তবে এটি আপনাকে সঠিক পথে নিয়ে যাওয়া উচিত


আমি এখানে সন্দিহান হচ্ছি তবে আমার মনে হয় না if not request.is_ajax()এটি পুরোপুরি নিরাপদ is যে ব্যক্তি অধিবেশনটির প্রাক-সমাপ্তির ছদ্মবেশ / একটি অজ্যাক্স কল পাঠিয়ে অধিবেশন চালিয়ে যেতে পারে তাকে ধরে রাখতে পারে না?
notbad.jpeg

4
@ notbad.jpeg: সাধারণভাবে "ক্রিয়াকলাপ" সহজেই ছদ্মবেশী। কেউ যে অধিবেশন ধরে রাখে এবং অনুরোধগুলি প্রেরণ করে চলেছেন কেবল সক্রিয়।
রিমকো গ্রিলিচ

এটি একটি দুর্দান্ত উত্তর। জ্যাঙ্গো বিকাশের জন্য মিডলওয়্যার একটি খুব নিম্নরক্ত সরঞ্জাম tool
জেমি কাউন্সেল

34

জ্যাঙ্গো ব্যবহার করতে আমি কেবল বেশ নতুন।

আমি লগড ব্যবহারকারীর ঘনিষ্ঠ হওয়া বা কিছু সময়ের জন্য নিষ্ক্রিয় (নিষ্ক্রিয়তার সময়সীমা) এ থাকলে সেশনটির মেয়াদ শেষ হতে চেয়েছিলাম। আমি যখন এটি বের করার জন্য এটি গুগল করলাম, তখন এই এসওএফ প্রশ্নটি সবার আগে উপস্থিত হয়েছিল। সুন্দর উত্তরের জন্য ধন্যবাদ, আমি জাজানোতে অনুরোধ / প্রতিক্রিয়া চক্র চলাকালীন মিডলওয়্যারগুলি কীভাবে কাজ করে তা বোঝার জন্য সংস্থানগুলি সন্ধান করেছি। এটা খুব সহায়ক ছিল।

আমি এখানে শীর্ষ উত্তরের অনুসরণ করে আমার কোডে কাস্টম মিডলওয়্যার প্রয়োগ করতে চলেছিলাম। তবে আমি তখনও কিছুটা সন্দেহজনক ছিল কারণ এখানে সেরা উত্তরটি ২০১১ সালে সম্পাদিত হয়েছিল recent সাম্প্রতিক অনুসন্ধানের ফলাফল থেকে আমি সামান্য কিছুটা অনুসন্ধান করতে আরও সময় নিয়েছি এবং সহজ উপায় নিয়ে এসেছি।

SESSION_EXPIRE_AT_BROWSER_CLOSE = True
SESSION_COOKIE_AGE = 10 # set just 10 seconds to test
SESSION_SAVE_EVERY_REQUEST = True

আমি ক্রোম ছাড়া অন্য ব্রাউজারগুলি পরীক্ষা করে দেখিনি। 1. আমি যখন একটি ব্রাউজার বন্ধ করি তখন একটি সেশনের মেয়াদ শেষ হয়ে যায় এমনকি SESSION_COOKIE_AGE সেট করা থাকলেও। ২. কেবলমাত্র যখন আমি 10 সেকেন্ডের বেশি অলস ছিলাম তখনই একটি সেশনের মেয়াদ শেষ হয়ে গেল। SESSION_SAVE_EVERY_REQUEST কে ধন্যবাদ, যখনই আপনি নতুন অনুরোধটি আসেন, এটি সেশনটি সংরক্ষণ করে এবং মেয়াদ শেষ হওয়ার জন্য সময়সীমা আপডেট করে

এই ডিফল্ট আচরণটি পরিবর্তন করতে, SESSION_SAVE_EVERY_REQUEST সেটিংটি সত্যে সেট করুন। সত্য হিসাবে সেট করা হলে, জাঙ্গো প্রতিটি একক অনুরোধে সেশনটি ডাটাবেসে সংরক্ষণ করবে।

দ্রষ্টব্য যে সেশন কুকি কেবল তখনই প্রেরণ করা হয় যখন কোনও সেশন তৈরি বা সংশোধন করা হয়। যদি SESSION_SAVE_EVERY_REQUEST সত্য হয়, সেশন কুকি প্রতিটি অনুরোধে প্রেরণ করা হবে।

একইভাবে, প্রতিবার সেশন কুকি প্রেরণের সময় সেশন কুকির মেয়াদ শেষ হয়ে যায়।

জ্যাঙ্গো ম্যানুয়াল 1.10

আমি কেবল উত্তরটি ছেড়ে দিয়েছি যাতে আমার মতো জাজানোতে এক ধরণের নতুন ব্যক্তি আমার মতো উপায় হিসাবে সমাধান খুঁজতে বেশি সময় ব্যয় না করে।


26

জ্যাঙ্গো-সেশন-সুরক্ষা ঠিক তাই করে ...

... একটি অতিরিক্ত প্রয়োজনীয়তা সহ: সার্ভারটি যদি সাড়া না দেয় বা কোনও আক্রমণকারী ইন্টারনেট সংযোগটি সংযোগ বিচ্ছিন্ন করে: এটি যাইহোক শেষ হতে হবে।

দাবি অস্বীকারকারী: আমি এই অ্যাপ্লিকেশনটি বজায় রাখছি। তবে আমি এই সুতোটি খুব দীর্ঘকাল ধরে দেখছি :)


4
দুর্দান্ত অ্যাপ্লিকেশন - সুন্দরভাবে ডিজাইন এবং ভাল নির্মিত built সুন্দর, পরিষ্কার কোড ... ধন্যবাদ
নিকোরেলিয়াস

ব্যবহারকারী যখন / সে চলে যাওয়ার পরে ব্রাউজার বা ট্যাব (লগ আউট না করে) বন্ধ করে দেয়, তা কি এখনও ব্যবহারকারীকে লগআউট করতে বাধ্য করে? এটি কি এই শর্তটি পরিচালনা করে?
মেহমেট কাগন কায়াল্প

এটি খাঁটি-HTTP সেশনের কুকির মেয়াদ শেষ হবে না?
jpic

12

আপনার দ্বিতীয় প্রয়োজনীয়তা পূরণের একটি সহজ উপায় হ'ল সেটিংসে SESSION_COOKIE_AGE মান সেট করা। এই ক্ষেত্রে:

SESSION_COOKIE_AGE = 600      #10 minutes.

তবে, শুধুমাত্র এটি করে ব্যবহারকারীর কিছু ক্রিয়াকলাপ প্রদর্শিত হবে কিনা তা 10 মিনিটের পরে সেশনটির মেয়াদ শেষ হবে। এই সমস্যাটি মোকাবেলা করার জন্য, ব্যবহারকারী প্রত্যেকবার নিম্নলিখিত বাক্যটি দিয়ে যে কোনও ধরণের অনুরোধ সম্পাদন করে: স্বয়ংক্রিয়ভাবে মেয়াদোত্তীকরণের সময়টি স্বয়ংক্রিয়ভাবে পুনর্নবীকরণ করা যেতে পারে (আরও 10 মিনিটের জন্য)

request.session.set_expiry(request.session.get_expiry_age())

4
SESSION_COOKIE_AGE = 600 এটি প্রতিটি নতুন পৃষ্ঠার অনুরোধ বা পৃষ্ঠা রিফ্রেশ সহ সেশনগুলির বয়স বাড়িয়ে দেবে
আসিম

4
আমি নিশ্চিত করেছি যে কেবল সেটিংসই SESSION_COOKIE_AGEযথেষ্ট এবং যে কোনও অনুরোধ (সেশন কুকি প্রেরণ করা) স্বয়ংক্রিয়ভাবে সেশন কুকির মেয়াদ শেষ হবে।
ব্রুনো desthuilliers

4

এছাড়াও আপনি কার্যাদি মধ্যে স্ট্যাকওভারফ্লো বিল্ড ব্যবহার করতে পারেন

SESSION_SAVE_EVERY_REQUEST = True

সম্পূর্ণরূপে সম্পর্কিত নয় - প্রতিটি অনুরোধে সেশনটি সংশোধন করা হয়েছে কিনা তা পরীক্ষা করেই সেশন সেভ ("সেশন কুকি রিফ্রেশ" নয়) জোর করার জন্য এটি।
ব্রুনো desthuilliers

3

প্রথম অনুরোধে, আপনি সেশনটির সমাপ্তি হিসাবে সেট করতে পারেন

self.request.session['access_key'] = access_key
self.request.session['access_token'] = access_token
self.request.session.set_expiry(set_age) #in seconds 

এবং অ্যাক্সেস_কি এবং টোকেন ব্যবহার করার সময়,

try:
    key = self.request.session['access_key']
except KeyError:
    age = self.request.session.get_expiry_age()
    if age > set_age:
        #redirect to login page
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.