L34x88iT Δημοσ. 31 Μαρτίου 2021 Δημοσ. 31 Μαρτίου 2021 Καλησπέρα. Έχω φτιάξει ένα πίνακα στην βάση για να παίρνω κάποιες τιμες (σαν settings) δικαιωμάτων. Μετά με μία function που δίνω σαν παράραμετρο το id του permission, παίρνω απάντηση των ρόλο, οπού 1 είναι διαχειριστής, 2 Αρχισυντάκτης, 3 Συντάκτης. Μέσα στην function συγκρίνω τον ρόλο του χρήστη με αυτό του permission και αν έχει δικαιώματα παίρνω true, αλλιώς false. =================== πχ permissionId | PermissionTitle | PermissionMinRole 1 | Write_article | 3 2 | Edit_article | 3 3 | Publish_article | 2 4 | Add_author | 1 Όλα τα παραπάνω δουλεύουν μια χαρά, απλά τα έγραψα για να έχετε μια εικόνα στο πρόβλημα που θα γράψω παρακάτω. Στον πίνακα αυτόν έχω βάλει γύρω στα 80 permissions. Μετά έχω βάλει την function σε όλα τα σημεία που θέλω να ελέγξω. Σε πολλες σελίδες. Το πρόβλημα που αντιμετώπισα τώρα και δεν το είχα σκεφθεί, είναι που θέλω να φτιάξω μία φόρμα html για να αλλάζω τα δικαιώματα αυτά. Όμως το κάθε permission είναι και ένα διαφορετικό row. ==================== Αν το είχα κάνει εξαρχής σε ένα row, δηλαδή id | Write_article | Edit_article | Publish_article | Add_aythor 1 | 3 | 3 | 2 | 1 Δεν θα είχα πρόβλημα γιατί θα έπερνα τα post από την φόρμα και θα τα έβαζα με $data = array(' "Write_article" => 3, "Edit_article" => 3, "Publish_article" => 2, "Add_author" => 1 ') ......where('id',1); ......insert('permissions',$data); ==================== Τώρα όμως; υπάρχει λύση, ωστε να μην τα φτιάξω από την αρχή και φυσικά να μην χρειαστεί να φτιάξω 80 φόρμες; ==================== Υ.Γ. Μια άλλη λύση σκέφτηκα να παίρνω όλα τα ποστ από την φόρμα στο κοντρολερ και μετα να κανω 80 φορές το βήμα: $data = array('"Write_article" => 3') ......where('id',1); ......insert('permissions',$data); $data = array('"Edit_article" => 3') ......where('id',2); ......insert('permissions',$data); $data = array('"Publish_article" => 3') ......where('id',3); ......insert('permissions',$data); κλπ κλπ Αλλά δεν μου φαίνεται και αυτός καλός τρόπος. Έχετε να προτείνετε κάτι άλλο;
dewn735 Δημοσ. 1 Απριλίου 2021 Δημοσ. 1 Απριλίου 2021 Δε καταλαβαίνω γιατί χρειάζεσαι 80 (!!!!) διαφορετικά permissions - anyway, εγώ θα έπαιζα με Bitwise Operators. Δηλαδή: permissionId | PermissionTitle | PermissionMinRole | weight 1 | READ | 1 | 1 2 | WRITE | 1 | 2 3 | DELETE | 1 | 4 4 | EDIT | 1 | 8 ... όπου το weight είναι σε δύναμη του 2, μοναδικό για κάθε γραμμή. Οπότε, σε κάθε χρήστη έχεις ένα μόνο πεδίο permissions, όπου η τιμή του είναι το αποτέλεσμα του (permission1.weight + permission2.weight + permission3.weight & ...) πχ, για δικαιώματα read + write + delete, στη γραμμή του χρήστη θα έβαζες 1 + 2 + 4 = 7, το οποίο σε δυαδικό είναι το 00001011. Σε αυτή τη περίπτωση, κάθε '1' στο δυαδικό είναι και ένα permission. Έτσι, για να δεις αν μπορεί να διαβάσει, πρέπει να βρεις το αποτέλεσμα του (00001011 & 00000001) - εδώ σου δίνει αποτέλεσμα '1', οπότε έχει άδεια για READ. Για DELETE από την άλλη, έχεις: (00001011 & 00000100) = 0, οπότε ΔΕΝ έχει δικαίωμα για DELETE Για να δεις αν ο χρήστης μπορεί πχ να διαβάσει, κάνεις τον έλεγχο: <?php if (($user_permissions & $weight['READ']) == $weight['READ']) return true; else return false; ?> 1
L34x88iT Δημοσ. 1 Απριλίου 2021 Μέλος Δημοσ. 1 Απριλίου 2021 Αν και ψιλομπερδευτηκα, θα το κοιταξω ομως εκτενεστερα να συλλαβω τον τροπο σκεψης. Μην ξεχνας ομως οτι θελω να βαλω δικαιωματα σε ομαδες μελων και οχι σε μεμονωμενα μελη. Αυτη την στιγμη εχω περιπου 250 μελη που θελω να τα χωρισω σε 3-4 κατηγοριες δικαιωματων. Επισης αν εχω γυρω στα ογδοντα διαφορετικα ειδη περμισιονς, δεν ξερω που θα φτασουν τα νουμερα με την δυναμη του 2
k33theod Δημοσ. 1 Απριλίου 2021 Δημοσ. 1 Απριλίου 2021 Εγώ πάλι δεν καταλάβα την ερώτηση. Για να κάνεις update έναν πίνακα στην database πάντα μία φόρμα χρησιμοποιείς ανεξάρτητα των αριθμό των εγγραφών που έχει 1 ή 1000000. Όταν δηλαδή πχ καλείς το url /permission/update/3 η φόρμα φορτώνει και μπορείς να αλλάξεις την εγγραφή με id 3. 1
filip123go Δημοσ. 1 Απριλίου 2021 Δημοσ. 1 Απριλίου 2021 Στις 31/3/2021 στις 8:50 ΜΜ, L34x88iT είπε Στον πίνακα αυτόν έχω βάλει γύρω στα 80 permissions. Μετά έχω βάλει την function σε όλα τα σημεία που θέλω να ελέγξω. Σε πολλες σελίδες. Το πρόβλημα που αντιμετώπισα τώρα και δεν το είχα σκεφθεί, είναι που θέλω να φτιάξω μία φόρμα html για να αλλάζω τα δικαιώματα αυτά. Όμως το κάθε permission είναι και ένα διαφορετικό row. Στις 31/3/2021 στις 8:50 ΜΜ, L34x88iT είπε Έχω φτιάξει ένα πίνακα στην βάση για να παίρνω κάποιες τιμες (σαν settings) δικαιωμάτων. Μετά με μία function που δίνω σαν παράραμετρο το id του permission, παίρνω απάντηση των ρόλο, οπού 1 είναι διαχειριστής, 2 Αρχισυντάκτης, 3 Συντάκτης. Δηλαδή θέλεις πχ το 1 - διαχειριστής να το κάνεις update και να γίνει 1 - apache helicopter ? Στη φόρμα html τι ακριβώς θα εισάγεις; 1
L34x88iT Δημοσ. 2 Απριλίου 2021 Μέλος Δημοσ. 2 Απριλίου 2021 (επεξεργασμένο) 17 ώρες πριν, k33theod είπε Εγώ πάλι δεν καταλάβα την ερώτηση. Για να κάνεις update έναν πίνακα στην database πάντα μία φόρμα χρησιμοποιείς ανεξάρτητα των αριθμό των εγγραφών που έχει 1 ή 1000000. Όταν δηλαδή πχ καλείς το url /permission/update/3 η φόρμα φορτώνει και μπορείς να αλλάξεις την εγγραφή με id 3. Καλησπέρα. Εστω οτι έχω ένα πίνακα permissions Ας μην ασχοληθούμε με το πως δουλεύει γιατί δουλεύει όπως θέλω ακριβώς. Ας εστιάσουμε στο edit του πίνακα από την φόρμα μου. Εννοείται οτι θέλει μία φόρμα αν πρόκειται να γίνει Edit 1 row. Εγώ μιλάω για όλο τον πίνακα αν μπορεί να γίνει με μία φόρμα. Για παράδειγμα θέλω να αλλάζω το PermissionMinRole μου στο παραπάνω πίνακα με την παρακάτω φόρμα. ========================================== Το ξέρω οτι αν είχα κάνει τον πινακά μου έτσι Δεν θα είχα πρόβλημα γιατί με την μία φόρμα μου θα άλλαζα πάντα τις τιμές του row #1 =========================================== Πείτε μου αν έγινα πιο κατανοητός... Επεξ/σία 2 Απριλίου 2021 από L34x88iT
k33theod Δημοσ. 2 Απριλίου 2021 Δημοσ. 2 Απριλίου 2021 Δυστηχώς όχι Γενικά παντώς ισχύει ότι κάθε model πχ Post (αν καταλαβαίνω καλά τι είναι το Post) έχει 4 permission read write update delete (μπορεί να τα δεις και αλλιώς view create klp) που αντιστοιχούν στο select, insert, update, kai delete της sql και αυτά ορίζόνται για κάθε role. Tα models και τα roles (συντάκτης px) σε επίπεδο permission είναι μια σχέση many to many. Οπότε στή φόρμα όταν κάνεις insert επιλέγεις το model το role και τα 4 permissions. Οταν κάνει update παίρνεις από τη βάση το authorization για Article kai sintakti px το αλλάζεις και το σωζεις. Αυτή είναι μια εικόνα από το admin panel του django για authorization. Επιλέγω πάνω τον role px Markler και κάτω για κάθε model του ορίζω το καθένα από read write update delete 1 1
MastroGiannis Δημοσ. 3 Απριλίου 2021 Δημοσ. 3 Απριλίου 2021 (επεξεργασμένο) 18 ώρες πριν, L34x88iT είπε Ας μην ασχοληθούμε με το πως δουλεύει γιατί δουλεύει όπως θέλω ακριβώς. Με την υπάρχουσα δομή του πίνακα permissions, κάθε Permission μπορεί να ανήκει μόνο σε ένα Role. Αυτό είναι που θέλεις; Τι θα κάνεις αν δυο Roles θα χρειαστεί να διαθέτουν το ίδιο Permission; θα επαναλάβεις το PermissionTitle σε μια νέα εγγραφή με άλλο PermissionId; Κανονικά, χρειάζεσαι έξτρα πίνακα συνένωσης των permissions και των roles με σχέση many-to-many, όπως ακριβώς τα λέει ο k33theod παραπάνω. Τέλος πάντων, έτσι όπως το έχεις, σε SQL, θα μπορούσες να πεις: UPDATE permissions SET PermissionMinRole=2 WHERE PermissionId IN(2, 3, 5, 6) 18 ώρες πριν, L34x88iT είπε Το ξέρω οτι αν είχα κάνει τον πινακά μου έτσι Αυτό δεν είναι πίνακας. Αυτό είναι spreadsheet. Επίσης, είναι κάπως αντιστραμμένη η οπτική σου. Κανονικά, αναθέτεις δικαιώματα σε ρόλους και όχι ρόλους σε δικαιώματα. Επεξ/σία 3 Απριλίου 2021 από MastroGiannis 1 1
L34x88iT Δημοσ. 3 Απριλίου 2021 Μέλος Δημοσ. 3 Απριλίου 2021 3 ώρες πριν, MastroGiannis είπε Με την υπάρχουσα δομή του πίνακα permissions, κάθε Permission μπορεί να ανήκει μόνο σε ένα Role. Αυτό είναι που θέλεις; Τι θα κάνεις αν δυο Roles θα χρειαστεί να διαθέτουν το ίδιο Permission; θα επαναλάβεις το PermissionTitle σε μια νέα εγγραφή με άλλο PermissionId; Δεν βάζω permissions σε roles. Στην ουσία δηλώνω από ποιο role και πάνω θα έχει δικαιώματα κάποιος. Δηλαδή αν στο Edit title έχω το 2 σημαίνει οτί έχουν δικαιώματα όσοι ο ρόλος τους είναι ισο ή κάτω από 2. Δηλαδή οι διαχειριστές(1) και οι αρχισυντάκτες(2) ενώ οι συντάκτες(3) και οι συνδρομητές(4) δεν έχουν. Δηλαδή δίνω permission οταν (UserRole <= PermissionMinRole). Ξέρω οτι ίσως δεν είναι ο καλύτερος τρόπος αλλά μου δουλεύει μια χαρά. 3 ώρες πριν, MastroGiannis είπε Κανονικά, χρειάζεσαι έξτρα πίνακα συνένωσης των permissions και των roles με σχέση many-to-many, όπως ακριβώς τα λέει ο k33theod παραπάνω. Τέλος πάντων, έτσι όπως το έχεις, σε SQL, θα μπορούσες να πεις: UPDATE permissions SET PermissionMinRole=2 WHERE PermissionId IN(2, 3, 5, 6) Ευχαριστώ φίλε θα το προσαρμόσω και θα το δοκιμάσω έτσι 3 ώρες πριν, MastroGiannis είπε Αυτό δεν είναι πίνακας. Αυτό είναι spreadsheet. Επίσης, είναι κάπως αντιστραμμένη η οπτική σου. Κανονικά, αναθέτεις δικαιώματα σε ρόλους και όχι ρόλους σε δικαιώματα. Ναι για να εμφανίσω κάπως τι έννοω το έφτιαξα αυτό στο excel. Για παράδειγμα
MastroGiannis Δημοσ. 3 Απριλίου 2021 Δημοσ. 3 Απριλίου 2021 7 ώρες πριν, L34x88iT είπε Ναι για να εμφανίσω κάπως τι έννοω το έφτιαξα αυτό στο excel. Για παράδειγμα Συγγνώμη, δεν ήμουν εγώ σαφής. Εννοούσα δομή δεδομένων τύπου "spreadsheet", κάτι το οποίο θα πρέπει να αποφύγεις οπωσδήποτε. Αν έχεις τα δεδομένα σε μορφή πεδίων (fields) αντί εγγραφών (records), σε κάθε προσθαφαίρεση permissions θα αναγκάζεσαι σε τροποποίηση της δομής του πίνακα (ALTER TABLE) με ό,τι αυτό συνεπάγεται. 7 ώρες πριν, L34x88iT είπε Δεν βάζω permissions σε roles. Στην ουσία δηλώνω από ποιο role και πάνω θα έχει δικαιώματα κάποιος. Χμ… Είναι λοιπόν ιεραρχική η προσέγγισή σου, γι’ αυτό δεν σ’ "έπιασα" από την αρχή. Ενδιαφέρουσα φαίνεται και ίσως απλοποιεί τις περαιτέρω διαδικασίες, δεν ξέρω όμως τι παγίδες πιθανόν να κρύβει στην πράξη. Για παράδειγμα, πόσο δύσκολη θα είναι η διασφάλιση της ιεραρχίας των ρόλων, αφού το κριτήριο είναι απλά αριθμητικό. Ένας ρόλος με id (ή rank) 0 για παράδειγμα, διαθέτει όλα τα δικαιώματα. Ίσως τα πιο έμπειρα μέλη να έχουν κάποια γνώμη επί τούτου. 7 ώρες πριν, L34x88iT είπε Ευχαριστώ φίλε θα το προσαρμόσω και θα το δοκιμάσω έτσι Να ‘σαι καλά! Θεωρώ πάντως πως η φόρμα σου θέλει άλλο στήσιμο για να εκμεταλλευτείς το UPDATE που πρότεινα, διότι επενεργεί σε πολλά permissions για ένα συγκεκριμένο role κάθε φορά (κάθε POST). Εφόσον, λογικά, οι ρόλοι είναι πολύ λιγότεροι από τα δικαιώματα, ένα dropdown για τον ρόλο και μια λίστα για τα δικαιώματα θα ήταν πιο «λογική» και λειτουργική υλοποίηση, όπως αυτή που παραθέτει ο k33theod παραπάνω. Καλή συνέχεια! 1
L34x88iT Δημοσ. 6 Απριλίου 2021 Μέλος Δημοσ. 6 Απριλίου 2021 Στις 3/4/2021 στις 9:43 ΜΜ, MastroGiannis είπε Χμ… Είναι λοιπόν ιεραρχική η προσέγγισή σου, γι’ αυτό δεν σ’ "έπιασα" από την αρχή. Ενδιαφέρουσα φαίνεται και ίσως απλοποιεί τις περαιτέρω διαδικασίες, δεν ξέρω όμως τι παγίδες πιθανόν να κρύβει στην πράξη. Για παράδειγμα, πόσο δύσκολη θα είναι η διασφάλιση της ιεραρχίας των ρόλων, αφού το κριτήριο είναι απλά αριθμητικό. Ένας ρόλος με id (ή rank) 0 για παράδειγμα, διαθέτει όλα τα δικαιώματα. Ίσως τα πιο έμπειρα μέλη να έχουν κάποια γνώμη επί τούτου. Θα προσπαθήσω να αλλάξω την διαδικασία. Απλά μέχρι τότε επειδη με τρόμαξε αυτό που λες, μάλλον εννοείς αν ο ρόλος δεν είναι σεταρισμένος ή αν είναι NULL(0) εννοείς μάλλον ε? Απλά στην function που ελέγχει τα permissions δεν έχω βάλει μόνο την σύγκριση του role με τοπ permissionMinRole αλλά με ένα AND έχω βάλει και το role να είναι πάνω από 1. Επαναλαμβάνω οτι θα το αλλάξω το τρόπο όπως μου είπατε, απλά μέχρι τότε αν με καλύπτει αυτό που λέω παραπάνω
MastroGiannis Δημοσ. 6 Απριλίου 2021 Δημοσ. 6 Απριλίου 2021 4 ώρες πριν, L34x88iT είπε Επαναλαμβάνω οτι θα το αλλάξω το τρόπο όπως μου είπατε, απλά μέχρι τότε αν με καλύπτει αυτό που λέω παραπάνω Αν η συγκεκριμένη Function είναι το μοναδικό σημείο άντλησης της πληροφορίας, τότε ναι, ίσως μπορείς να διασφαλίσεις το τι θα βγαίνει προς τα έξω. Όπως βλέπεις όμως, ο τρόπος αυτός είναι "λογικός" και απαιτεί πολλαπλούς λογικούς ελέγχους στα αιτήματα, ενώ, ο προτεινόμενος τρόπος είναι "ρεαλιστικός", με την έννοια ότι, ανεξάρτητα από τον τρόπο (Function ή Query), παίρνεις μόνο ό,τι είναι αποθηκευμένο. Να σημειώσω ότι δεν έχω καμία εμπειρία σε θέματα ασφάλειας και ότι απλά καταθέτω τις σκέψεις μου. 1
tsofras Δημοσ. 6 Απριλίου 2021 Δημοσ. 6 Απριλίου 2021 Στις 2/4/2021 στις 4:12 ΜΜ, L34x88iT είπε Καλησπέρα. Εστω οτι έχω ένα πίνακα permissions Ας μην ασχοληθούμε με το πως δουλεύει γιατί δουλεύει όπως θέλω ακριβώς. Ας εστιάσουμε στο edit του πίνακα από την φόρμα μου. Εννοείται οτι θέλει μία φόρμα αν πρόκειται να γίνει Edit 1 row. Εγώ μιλάω για όλο τον πίνακα αν μπορεί να γίνει με μία φόρμα. Για παράδειγμα θέλω να αλλάζω το PermissionMinRole μου στο παραπάνω πίνακα με την παρακάτω φόρμα. ========================================== Το ξέρω οτι αν είχα κάνει τον πινακά μου έτσι Δεν θα είχα πρόβλημα γιατί με την μία φόρμα μου θα άλλαζα πάντα τις τιμές του row #1 =========================================== Πείτε μου αν έγινα πιο κατανοητός... Ξέρω ότι είπες ότι δεν θές να αλλάξεις πολύ την δομή που έχεις φτιάξει αλλά θεωρώ ότι θα ήταν καλύτερος τρόπος: 1)Να φτιάξεις ένα πίνακα με ρόλους (Αρχισυντάκτης , Συντάκτης , Διαχειριτής , Απλός χρήστης ) 2) Να φτιάξεις έναν πίνακα που να έχει απλά τον κουβά με όλα τα δικαιώματα που έχεις 3) Να έχεις έναν πίνακα με τους χρήστες και τον ρόλο που έχει ο κάθε χρήστης 4) Να φτιάξεις έναν πίνακα που να περιέχει τα δικαιώματα που έχει ο κάθε ρόλος Με την παραπάνω δομή θα μπορείς να αλλάζεις τα δικαιώματα μόνο στους ρόλους και θα τα κληρονομούν οι υπόλοιποι. Επίσης θα μπορείς να έχεις έναν χρήστη που δεν ανήκει σε κάποιο ρόλο και του έχεις δώσει απλά κάποια συγκεκριμένα δικαιώματα Ξέρω ότι δεν θέλεις να κάνεις τέτοιες αλλαγές απλά είπα να στο γράψω να το έχεις σαν πιθανή δομή σε επόμενο project 1
L34x88iT Δημοσ. 7 Απριλίου 2021 Μέλος Δημοσ. 7 Απριλίου 2021 (επεξεργασμένο) 17 ώρες πριν, tsofras είπε Ξέρω ότι είπες ότι δεν θές να αλλάξεις πολύ την δομή που έχεις φτιάξει αλλά θεωρώ ότι θα ήταν καλύτερος τρόπος: 1)Να φτιάξεις ένα πίνακα με ρόλους (Αρχισυντάκτης , Συντάκτης , Διαχειριτής , Απλός χρήστης ) 2) Να φτιάξεις έναν πίνακα που να έχει απλά τον κουβά με όλα τα δικαιώματα που έχεις 3) Να έχεις έναν πίνακα με τους χρήστες και τον ρόλο που έχει ο κάθε χρήστης 4) Να φτιάξεις έναν πίνακα που να περιέχει τα δικαιώματα που έχει ο κάθε ρόλος Με την παραπάνω δομή θα μπορείς να αλλάζεις τα δικαιώματα μόνο στους ρόλους και θα τα κληρονομούν οι υπόλοιποι. Επίσης θα μπορείς να έχεις έναν χρήστη που δεν ανήκει σε κάποιο ρόλο και του έχεις δώσει απλά κάποια συγκεκριμένα δικαιώματα Ξέρω ότι δεν θέλεις να κάνεις τέτοιες αλλαγές απλά είπα να στο γράψω να το έχεις σαν πιθανή δομή σε επόμενο project Χωρίς να θέλω να προσβάλλω τους προηγούμενους που σιγουρα έχουν 100% δίκιο (Στο μυαλό μου δεν μπορώ να συλλάβω ακόμα τον τρόπο που λέτε (οπως δεν μπορεσα ποτέ να αντιληφθώ καλά τους αναδρομικούς αλγόριθμους που κάναμε στη σχολή 😄)), στο μυαλό μου μου έρχεται πιο καλά αυτή η *λύση! *Μπορεί να είναι σχεδόν το ίδιο με αυτό που λένε οι προηγούμενοι, τώρα το κατάλαβα λίγο καλύτερα... Επεξ/σία 7 Απριλίου 2021 από L34x88iT 1
k33theod Δημοσ. 7 Απριλίου 2021 Δημοσ. 7 Απριλίου 2021 Το 1ο νομίζω που κάνεις λάθος και ξεκίνησε το θέμα και δεν ξέρω αν ακόμη είναι ξεκάθαρο, είναι ότι με λάθος φορμα προσπαθείς να αλλάξεις κάποιον πίνακα στην database Η φόρμα με τον πίνακα πρέπει να είναι σε αντιστοιχεία. Αν Θέλω να αλλάξω πίνακα που έχει permission_id, permission_title, permission_role, κάνω μια φόρμα που έχει όλα ή κάποια από αυτά τα στοιχεία και τα αλλάζω. Η φόρμα μου δηλαδή πρέπει απλά να έχει επιλογές για permission_title και permission_role. Εφόσον λοιπόν όπως λες το σύστημα authorization που έχεις λειτουργεί, και το πρόβλημα είναι να κάνεις edit τον πίνακα με φόρμα, κάνεις την σωστή φόρμα και τέλος. Αυτά που λέει ο tsofras είναι σωστά και είναι ένα τυπικό σύστημα. Μόνο αυτό με το κληρονομεί δεν κατάλαβα 😃
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα