Απαγόρευση login ταυτόχρονα από δύο ή περισσότερους χρήστες.

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Απαγόρευση login ταυτόχρονα από δύο ή περισσότερους χρήστες.

Δημοσίευση από jpk » 01 Οκτ 2012 17:21

Γιατί στον πίνακα users να μην έχεις ένα πεδίο LAST_LOGGED που να είναι TIMESTAMP ή ΙΝΤ(10) και να αφήνεις κάποιον να μπει αν έχει απόσταση από αυτό τα X δευτερόλεπτα που ορίζεις.

Το μόνο που σου μένει είναι να κάνεις update αυτό το πεδίο κάθε φορά που ο χρήστης μπαίνει , κάθε φορά που ανανεώνετε σελίδα ή (επειδή δεν πρόκειται να πατήσει log out , και απλά θα κλείσει το παράθυρο , τον browser , το λειτουργικό , το ρεύμα) , (και φυσικά μέχρι η χρήση των WebSockets ενιαιοποιηθεί ) ένα AJAX call κάθε x δευτερόλεπτα που λέει «είμαι ο τάδε και είμαι ακόμα μέσα» και να κάνεις update το LAST_LOGGED .

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Απαγόρευση login ταυτόχρονα από δύο ή περισσότερους χρήστες.

Δημοσίευση από dva_dev » 01 Οκτ 2012 18:09

Αν μπει στον users δεν θα ξέρεις από τα 50 διαφορετικά sessions που είναι ανοιχτά (50 χρήστες έκαναν login με το ίδιο username) ποιός είναι αυτός που ενημέρωσε το timeout και ποιά σύνδεση έχει ξεπεράσει το όριο για να τον πετάξεις έξω.

Επιπλέον, το timeout σαν χαρακτηριστικό ανήκει στη σύνδεση του χρήστη και όχι στον ίδιο το χρήστη οπότε μου φαίνεται λάθος να μπεί σε αυτόν τον πίνακα. Αντίθετα το ονοματεπώνυμο είναι χαρακτηριστικό που θα μπορούσε να μπεί στον πίνακα users.

Επίσης σου δίνει δυνατότητες για customization με μικρές αλλαγές.
Π.χ.:
ο χρήστης dva_dev να έχει timeout 10' ενώ ο χρήστης jpk 10".
σε κάποια σελίδα με παραγγελίες να κάνει ο χρήστης timeout στα 20' ενώ στη σελίδα με ακύρωση παραγγελιών να κάνει timeout στα 5" (εκτός αν είναι το αφεντικό που δεν κάνει timeout ποτέ).
Σε ώρες εργασίας το timeout να είναι μεγαλύτερο (π.χ. 20') ενώ σε μη εργάσιμες μικρότερο 5'.

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Απαγόρευση login ταυτόχρονα από δύο ή περισσότερους χρήστες.

Δημοσίευση από Apostolis_38 » 01 Οκτ 2012 20:46

Αν δημιουργήσεις session το οποίο να περιέχει και το id του user τότε δεν θα έχεις πρόβλημα με το ποιο timeout ανήκει σε ποιόν.
Για να κάνεις αυτό που λες με τον ορισμό διαφορετικών timeout ανα χρήστη ίσως έτσι να είναι πιο σωστό αλλά και με ένα if-else loop με το οποίο τσεκάρεις το session+id μπορείς να βάλεις διαφορετικά όρια.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Απαγόρευση login ταυτόχρονα από δύο ή περισσότερους χρήστες.

Δημοσίευση από dva_dev » 01 Οκτ 2012 21:22

Αν δημιουργήσεις session το οποίο να περιέχει και το id του user τότε δεν θα έχεις πρόβλημα με το ποιο timeout ανήκει σε ποιόν.
Τι εννοείς; Αν το timeout το αποθηκεύεις στο user, τότε όλα τα sessions που φτιάχνονται γι αυτόν τον user θα έχουν το ίδιο timeout. Πως θα ξέρεις ποιό να πετάξεις έξω;

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Απαγόρευση login ταυτόχρονα από δύο ή περισσότερους χρήστες.

Δημοσίευση από Apostolis_38 » 01 Οκτ 2012 21:31

Υποτίθεται οτι όλη η ιστορία γίνεται για να μην μπορεί να μπεί και δεύτερος με τα ίδια στοιχεία.
Αν πιάσεις να πάει να γίνει κάτι τέτοιο σημαίνει οτι κάτι τρέχει και τους πετάς όλους έξω.
Αλλιώς γιατί να μην τους αφήσεις να κάνουν ότι θέλουν.

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Απαγόρευση login ταυτόχρονα από δύο ή περισσότερους χρήστες.

Δημοσίευση από jpk » 01 Οκτ 2012 22:44

Για να μην μπερδευόμαστε … ποιο είναι το demand ;
Αν ένας χρήστης έχει κάνει ήδη log in να μην επιτρέπεται δεύτερο μέχρι να κάνει log out.

Τόσο απλό. Δεν πρέπει να «πετάξεις» κανένα έξω … απλά να μην αποδεχτείς το log – in του και το session δεν είναι δα και ο απόλυτος παράγων απλά ένας δευτερεύων όρος. Είπα ότι αν αποθηκεύεις το LAST_LOGGED σε TIMETAMP ή INT(10) ξέρεις πολύ καλά την τελευταία φορά που εξουσιοδοτημένος χρήστης υπήρξε σε αυτόν τον λογαριασμό , ανανεώνοντας φυσικά αυτό σε κάθε ανανέωση σελίδας ή / και με AJAX αν Χ δευτερόλεπτα. Φυσικά δεν θα επιτρέψεις σε κάποιον άλλον χρήστη να κάνει log in σε αυτά τα X δευτερόλεπτα.

Για να είμαι σαφής που έρχεται ο ρόλος του session και μόνο , στο να ταυτοποιήσεις την προέλευση της κλήσης AJAX που δέχεσαι, ή της ανανέωσης. Υπάρχουν και άπειροι άλλοι τρόποι για αυτή την ταυτοποίηση (έχω πρόχειρο ένα ακόμα) αλλά πραγματικά δεν χρειάζεται να μπλέκεις περισσότερο απλά πράγματα , οπότε και το session εντάξει είναι

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Απαγόρευση login ταυτόχρονα από δύο ή περισσότερους χρήστες.

Δημοσίευση από jpk » 01 Οκτ 2012 22:53

dva_dev έγραψε:όλα τα sessions που φτιάχνονται γι αυτόν τον user θα έχουν το ίδιο timeout. Πως θα ξέρεις ποιό να πετάξεις έξω;
Είμαι σίγουρος ότι έχεις παραπάνω αντίληψη για το τι είναι οι διαδικτυακές εφαρμογές και αυτό απλά σου ξέφυγε. Προβληματίσου αλλά μην αγχώνεσαι και πολύ , όλοι έχουμε πει και εφαρμόσει ανά καιρούς απίστευτες ανοησίες.

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Απαγόρευση login ταυτόχρονα από δύο ή περισσότερους χρήστες.

Δημοσίευση από Apostolis_38 » 01 Οκτ 2012 23:14

Αν δεν έχεις κρατήσει κάπου οτι ο χρήστης 1 έχει ήδη κάνει login πως θα μπορέσεις να μην αποδεχτείς το login του χρήστη 2;
Μόνο με το timeout;
Εκτός κι αν δεν αφήσεις τον οποιονδήποτε πάει να μπει στο σύστημα για το προκαθορισμένο χρόνο.

Πιθανός να μην έχω πιάσει ακριβώς τον συλογισμό σου.
Ανέλυσε τον λίγο.

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Απαγόρευση login ταυτόχρονα από δύο ή περισσότερους χρήστες.

Δημοσίευση από jpk » 02 Οκτ 2012 06:28

Apostolis_38 έγραψε: Εκτός κι αν δεν αφήσεις τον οποιονδήποτε πάει να μπει στο σύστημα για το προκαθορισμένο χρόνο.
Αυτό τελικά δεν είναι αυτό που θέλουμε; Να μπορεί να κάνει log in μόνο ένας χρήστης ανά username , αυτό κατάλαβα τουλάχιστον …. Αν το έχω αντιληφτεί λάθος τότε σίγουρα δεν ισχύει η λύση που πρότεινα.

Λίγο πιο αναλυτικά , ο «επισκέπτης 1» πραγματοποιεί επιτυχημένο log in , έτσι το πεδίο LAST_LOGGED γίνεται update με το timestamp που έγινε αυτό το log in. Το ότι ο «επισκέπτης 1» έχει πραγματοποιήσει log in μπορείς να το ξέρεις κάθε φορά με πολλούς τρόπους αλλά σίγουρα το session είναι ο ευκολότερος. Σε κάθε σελίδα που επισκέπτεται ο «επισκέπτης 1» αυτό το LAST_LOGGED ανανεώνεται με το τρέχων TIMESTAMP , επίσης το ίδιο συμβαίνει με κλήση AJAX ανά Χ δευτερόλεπτα για τον «επισκέπτη 1».

Ας υποθέσουμε ότι επιχειρεί να κάνει log in ο «επισκέπτης 2» με το ίδιο username. Ακόμα και σωστό password να έχει ελέγχουμε αν έχουν περάσει τα X δευτερόλεπτα από το LAST_LOGGED που έχουμε για τον χρήστη. Αν έχουν περάσει τότε του επιτρέπουμε , αν όχι σημαίνει ότι ο «επισκέπτης 1» είναι ακόμα μέσα οπότε δεν του επιτρέπουμε.

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Απαγόρευση login ταυτόχρονα από δύο ή περισσότερους χρήστες.

Δημοσίευση από Apostolis_38 » 02 Οκτ 2012 19:39

Οταν ο χρήστης 1 μπεί ή είναι ήδη μέσα και ο χρήστης 2 καταχωρήσει user name και password τότε (εφόσον θα δώσει τα σωστά στοιχεία) το script πολύ απλά θα πάει και θα ανανεώσει το last_logged και θα πετάξει τον άλλο έξω αν και εφόσον κάπου κρατείται το μοναδικό id του user. Αλλιώς θα είναι και οι δύο μέσα.
Εκτός κι αν (όπως πολύ σωστά αναφέρεις) πας και τρέξεις ένα query και υπολογίσεις τον χρόνο που άλλος είναι μέσα κ.λ.π. κ.λ.π.
Πράγμα το οποίο θα πρέπει να κάνεις συχνά κ.ο.κ.

Επίσης.
Ο χρήστης 1 κάνει login, δεν κάνει τίποτα εντός του χρονικού ορίου που εχεις ορίσει αρα το timestamp δεν ανανεώνεται. Ο χρήστης είναι ακόμα μέσα όμως. Γιατί να δώσεις στον 2ο το δικαίωμα να κάνει επιτυχημένο login;

Γιατί να κάνεις όλη αυτή την ιστορία και να μην κοιτάς απλά αν κάποιο πεδίο είναι 1 ή 0 (για παράδειγμα) μόνο τη στιγμή που κάποιος επιχειρεί να κάνει login.

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

Απαγόρευση login ταυτόχρονα από δύο ή περισσότερους χρήστες.

Δημοσίευση από jpk » 04 Οκτ 2012 13:44

Apostolis_38 έγραψε:Οταν ο χρήστης 1 μπεί ή είναι ήδη μέσα και ο χρήστης 2 καταχωρήσει user name και password τότε (εφόσον θα δώσει τα σωστά στοιχεία) το script πολύ απλά θα πάει και θα ανανεώσει το last_logged και θα πετάξει τον άλλο έξω αν και εφόσον κάπου κρατείται το μοναδικό id του user. Αλλιώς θα είναι και οι δύο μέσα.
Νόμιζα ότι το έχω εξηγήσει ήδη αναλυτικά αυτό.
jpg έγραψε:Ας υποθέσουμε ότι επιχειρεί να κάνει log in ο «επισκέπτης 2» με το ίδιο username. Ακόμα και σωστό password να έχει ελέγχουμε αν έχουν περάσει τα X δευτερόλεπτα από το LAST_LOGGED που έχουμε για τον χρήστη. Αν έχουν περάσει τότε του επιτρέπουμε , αν όχι σημαίνει ότι ο «επισκέπτης 1» είναι ακόμα μέσα οπότε δεν του επιτρέπουμε.

Apostolis_38 έγραψε:Εκτός κι αν (όπως πολύ σωστά αναφέρεις) πας και τρέξεις ένα query και υπολογίσεις τον χρόνο που άλλος είναι μέσα κ.λ.π. κ.λ.π.
Πράγμα το οποίο θα πρέπει να κάνεις συχνά κ.ο.κ.

Ένα update κάνεις στο LAST_LOGGED σε τρεις περιπτώσεις.
1. Όταν ο επισκέπτης πραγματοποιεί επιτυχημένο log-in (που σημαίνει ότι δεν υπάρχει άλλος επισκέπτης ταυτόχρονα – με διαφορά X δευτερόλεπτα – που είναι ήδη logged στο σύστημα με αυτόν τον λογαριασμό χρήστη)
2. Όταν ο επισκέπτης που έχει κάνει log-in (1) επισκέπτεται μια σελίδα
3. Κάθε Χ δευτερόλεπτα για τον συγκεκριμένο επισκέπτη που έχει κάνει log-in μέσω AJAX call από τον browser του συγκεκριμένου επισκέπτη

Και φυσικά πριν πας καν να ελέγξεις καν το password κάποιου που επιχειρεί log in πας και κάνεις ένα SELECT για να πάρεις το LAST_LOGGED του χρήστη που επιχειρείτε να συνδεθεί , για να δεις αν θα προχωρήσεις στην διαδικασία πιστοποίησης.

Apostolis_38 έγραψε:Γιατί να κάνεις όλη αυτή την ιστορία και να μην κοιτάς απλά αν κάποιο πεδίο είναι 1 ή 0 (για παράδειγμα) μόνο τη στιγμή που κάποιος επιχειρεί να κάνει login.


Αυτό είναι λίγο πολύ αυτό που πρότεινε και ο Khronos σχεδόν από την αρχή , με τους περιορισμούς που έβαλε και ο ίδιος π.χ.
Khronos έγραψε:Το θέμα είναι είναι τι γίνεται αν κάποιος κάνει logout όχι πατώντας το κουμπί αλλά κλείνοντας τον browser.


Θα προσέθετα και πολλές άλλες περιπτώσεις που κάτι τέτοιο δεν θα λειτουργούσε. Φυσικά θα μπορούσες να ανανεώνεις , στις ίδιες τρεις περιπτώσεις που ανέφερα πριν , όχι ένα πεδίο LAST_LOGGED αλλά ένα IS_LOGGED false/true 0/1 .

Εκεί όμως θα είχες ένα πρόβλημα λογικής, που αναφέρθηκε και στην λύση που είπε ο Khronos, πως θα γίνει αυτό το πεδίο 0 αν ο χρήστης δεν πατήσει το log out αλλά κλείσει το tab, τον browser , το λειτουργικό , το ρεύμα κ.ο.κ. ; Μια τέτοια προσέγγιση θα απαιτούσε ένα παραπάνω αρχείο (ή πίνακα) που θα είχε την έννοια του last logged μέσα και ένα job (π.χ. Cron) να τρέχει κάθε X δευτερόλεπτα που πραγματικά δεν υπάρχει λόγος.

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

Απαγόρευση login ταυτόχρονα από δύο ή περισσότερους χρήστες.

Δημοσίευση από korgr » 04 Οκτ 2012 15:15

Έχει χρειαστεί άπειρες φορές να είμαστε loged in στο ίδιο backend και εγώ και ο πελάτης, στα πλαίσια σεμιναρίου εκμάθησης. Αν άφηνε μόνο τον έναν το σύστημα δεν θα είχα αυτή την δυνατότητα, οπότε το "όποιος έχει κλειδιά μπαίνει" μου φαντάζει η καλύτερη προοπτική :D

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Απαγόρευση login ταυτόχρονα από δύο ή περισσότερους χρήστες.

Δημοσίευση από Apostolis_38 » 04 Οκτ 2012 15:57

@jpk.
Κοίτα, στην ουσία η υλοποίηση είναι η ίδια αλλά από άλλη οπτική. Νομίζω όμως πως δεν διάβασες τι έχω αναφέρει στα προηγούμενα posts. :(
Εσύ θες να τρέχεις ένα query για να δεις αν ο άλλος είναι μέσα και αναλόγως να επιτρέψεις στον χρήστη 2 να μπει ή όχι.
Εγώ προτιμώ να έχω ένα πεδίο με σήμανση 1 ή 0 και να τρέχω αυτό το query μόνο για να γυρίσω το logedin σε 0 αν δεν υπάρχει activity για χ χρονικό όριο (δεν ανανεώνεται δηλαδή το time). Αυτό για την περίπτωση που συντρέχει αυτό που ανέφερε ο khronos η οποία φυσικά και ισχύει και είναι πολύ συχνή. Δεν χρειάζεται κανένας πίνακας.

@korgr. Εντάξει, σωστό αυτό αλλά συζητάμε την περίπτωση που δεν θέλουμε κάτι τέτοιο.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Απαγόρευση login ταυτόχρονα από δύο ή περισσότερους χρήστες.

Δημοσίευση από dva_dev » 04 Οκτ 2012 18:04

Μήπως το καλύτερο θα ήταν να μπορείς να ορίζεις/παραμετροποιείς για κάθε username μέχρι πόσους χρήστες θέλεις να συνδέονται με προεπιλεγμένο π.χ. το 1 αν θέλεις να είναι μόνο ένας μέσα κάθε φορά;

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Απαγόρευση login ταυτόχρονα από δύο ή περισσότερους χρήστες.

Δημοσίευση από Apostolis_38 » 04 Οκτ 2012 22:24

Προσωπικά προτιμώ να μην αφήνω να υπάρχει πάνω από μια φορά ο συνδυασμός username και password.
Εχει κι άλλα πλεονεκτήματα, για παράδειγμα μπορείς να καταγράψεις τι και πότε έκανε κάτι ο κάθε user ή να τσιμπήσεις την ip του.
Σε περίπτωση που ο χρήστης δεν είναι μοναδικός χάνεις την μπάλα.

Για περιπτώσεις όπως αυτή που ανέφερε ο korgr (η οποία είναι υπαρκτή και αρκετά συνηθισμένη) προτιμώ να δημιουργώ κάποιον χρήστη test ο οποίος όμως να μην μπορεί να χαρχαλέψει κάποιους πίνακες που δεν πρέπει. Των users π.χ.
Αυτά όταν κάνει δική του την εφαρμογή και έχει την ευθύνη τών πράξεών του :)

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες