Ποιος είναι ο καλύτερος τρόπος για να χειριστεί πολλούς τύπους άδεια;

ψήφοι
17

Μου συμβαίνει συχνά να αντιμετωπίσετε το ακόλουθο σενάριο όπου θα πρέπει να προσφέρουν πολλούς διαφορετικούς τύπους αδειών. I κυρίως χρησιμοποιήσετε ASP.NET / VB.NET με τον SQL Server 2000.

Σενάριο

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

Στο παρελθόν, έχω επιλέξει έναν από τους εξής δύο τρόπους που ξέρω να το κάνουμε αυτό.

1) Χρησιμοποιήστε ένα ενιαίο πίνακα άδεια με ειδικές στήλες που χρησιμοποιούνται για τον προσδιορισμό ενός πώς να εφαρμόσει τις παραμέτρους. Οι ειδικές στήλες σε αυτό το παράδειγμα είναι TypeID και TypeAuxID. Το SQL θα δούμε κάτι σαν αυτό.

SELECT COUNT(PermissionID)
FROM application_permissions
WHERE
(TypeID = 1 AND TypeAuxID = @UserID) OR
(TypeID = 2 AND TypeAuxID = @DepartmentID)
AND ApplicationID = 1

2) Χρησιμοποιήστε ένα πίνακα αντιστοίχισης για κάθε τύπο άδειας, στη συνέχεια, που ενώνει όλα μαζί.

SELECT COUNT(perm.PermissionID)
FROM application_permissions perm
LEFT JOIN application_UserPermissions emp
ON perm.ApplicationID = emp.ApplicationID
LEFT JOIN application_DepartmentPermissions dept
ON perm.ApplicationID = dept.ApplicationID
WHERE q.SectionID=@SectionID
  AND (emp.UserID=@UserID OR dept.DeptID=@DeptID OR
 (emp.UserID IS NULL AND dept.DeptID IS NULL)) AND ApplicationID = 1
ORDER BY q.QID ASC

Σκέψεις μου

Ελπίζω ότι τα παραδείγματα που έχουν νόημα. Τους λιθόστρωτο μαζί.

Το πρώτο παράδειγμα απαιτεί λιγότερη εργασία, αλλά κανένας από αυτούς δεν αισθάνονται σαν την καλύτερη απάντηση. Υπάρχει καλύτερος τρόπος για να χειριστεί αυτό;

Δημοσιεύθηκε 04/08/2008 στις 18:46
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
10

Συμφωνώ με τον John Downey.

Προσωπικά, έχω μερικές φορές χρησιμοποιούν μια σημαία απαρίθμηση των δικαιωμάτων. Με αυτό τον τρόπο μπορείτε να χρησιμοποιήσετε το AND, OR, NOT και bitwise πράξεις XOR για τα στοιχεία της καταμέτρησης του.

"[Flags]
public enum Permission
{
    VIEWUSERS = 1, // 2^0 // 0000 0001
    EDITUSERS = 2, // 2^1 // 0000 0010
    VIEWPRODUCTS = 4, // 2^2 // 0000 0100
    EDITPRODUCTS = 8, // 2^3 // 0000 1000
    VIEWCLIENTS = 16, // 2^4 // 0001 0000
    EDITCLIENTS = 32, // 2^5 // 0010 0000
    DELETECLIENTS = 64, // 2^6 // 0100 0000
}"

Στη συνέχεια, μπορείτε να συνδυάσετε πολλά δικαιώματα με τη χρήση του τελεστή AND bitwise.

Για παράδειγμα, αν ένας χρήστης μπορεί να δει και να επεξεργαστείτε τους χρήστες, το δυαδικό αποτέλεσμα της πράξης είναι 0000 0011 που μετατράπηκε σε δεκαδικό είναι 3.
Στη συνέχεια μπορείτε να αποθηκεύσετε την άδεια ενός χρήστη σε μια ενιαία στήλη της βάσης δεδομένων σας (στην περίπτωσή μας θα ήταν να είναι 3).

Στο εσωτερικό της αίτησής σας, το μόνο που χρειάζεται μια άλλη λειτουργία bitwise (OR) για να ελέγξει αν ένας χρήστης έχει μια ιδιαίτερη άδεια ή όχι.

Απαντήθηκε 04/08/2008 στις 19:23
πηγή χρήστη

ψήφοι
10

Ο τρόπος που συνήθως πάει για συστήματα κωδικοποίησης άδεια έχει 6 τραπέζια.

  • Οι χρήστες - αυτό είναι αρκετά απλή, είναι τυπικό τραπέζι τους χρήστες σας
  • Ομάδες - αυτό θα ήταν συνώνυμο με τις υπηρεσίες σας
  • Ρόλοι - αυτό είναι ένας πίνακας με όλα τα δικαιώματα γενικά και περιλαμβάνει ένα αναγνώσιμο από τον άνθρωπο όνομα και μια περιγραφή
  • Users_have_Groups - αυτό είναι ένα πολλά-προς-πολλά πίνακα για το τι ομάδες που ένας χρήστης ανήκει
  • Users_have_Roles - άλλο ένα πολλά-προς-πολλά πίνακα του τι ρόλους έχουν εκχωρηθεί σε ένα μεμονωμένο χρήστη
  • Groups_have_Roles - η τελική πολλά-προς-πολλά πίνακα του τι ρόλους κάθε ομάδα έχει

Κατά την έναρξη της συνόδου χρήστες θα τρέξει κάποια λογική που βγάζει κάθε ρόλο που έχει ανατεθεί, είτε κατάλογο είτε μέσω μιας ομάδας. Στη συνέχεια, μπορείτε κώδικα κατά των ρόλων και δικαιώματα ασφαλείας σας.

Όπως είπα και αυτό είναι αυτό που συνήθως κάνουν, αλλά millage σας μπορεί να διαφέρουν.

Απαντήθηκε 04/08/2008 στις 18:56
πηγή χρήστη

ψήφοι
2

Ειλικρινά το ASP.NET Σύνθεση / Ρόλοι χαρακτηριστικά θα λειτουργήσει τέλεια για το σενάριο που περιγράφεται. Γράφοντας τις δικές τους πίνακες / procs / τάξεις σας είναι μια μεγάλη άσκηση και μπορείτε να πάρετε πολύ ωραία τον έλεγχο μικρές λεπτομέρειες, αλλά αφού το κάνετε αυτό τον εαυτό μου που έχω συνάψει ότι είναι καλύτερο να χρησιμοποιήσετε μόνο το ενσωματωμένο στο .NET πράγματα. Πολλά υπάρχοντα κώδικα έχει σχεδιαστεί για να λειτουργεί γύρω από αυτό το οποίο είναι ωραίο σε καλά. Γράφοντας από την αρχή μου πήρε περίπου 2 εβδομάδες και ήταν όταν δεν κοντά τόσο ισχυρή όσο .NETs. Θα πρέπει να κώδικα τόσο χάλια (ανάκτησης κωδικού πρόσβασης, αυτόματη κλείδωμα, κρυπτογράφηση, τους ρόλους, μια διεπαφή άδεια, τους τόνους των procs, κλπ) και ο χρόνος που θα μπορούσε να ήταν καλύτερο να δαπανηθούν αλλού.

Συγγνώμη αν δεν απαντήσω στην ερώτησή σας, είμαι σαν τον τύπο που λέει ότι για να μάθει C #, όταν κάποιος κάνει μια ερώτηση vb.

Απαντήθηκε 07/08/2008 στις 03:23
πηγή χρήστη

ψήφοι
2

Εκτός από τον John Downey και λύσεις jdecuyper του, έχω προσθέσει επίσης μια «Ρητή Deny» λίγο στο τέλος / αρχή του bitfield, έτσι ώστε να μπορείτε να εκτελέσετε δικαιώματα πρόσθετο από την ομάδα, τα μέλη του ρόλου, και στη συνέχεια αφαιρέστε τα δικαιώματα που βασίζεται ρητά αρνηθεί εγγραφές, σαν NTFS εργάζεται, άδεια-σοφός.

Απαντήθηκε 04/08/2008 στις 19:39
πηγή χρήστη

ψήφοι
0

Μια προσέγγιση που έχω χρησιμοποιήσει σε διάφορες εφαρμογές είναι να έχουμε μια γενική κατηγορία PermissionToken που έχει μια ευμετάβλητη ιδιότητα Value. Στη συνέχεια, μπορείτε ερώτημα για την ζητούμενη αίτηση, σας λέει ποια είναι PermissionTokens χρειάζονται για να το χρησιμοποιήσετε.

Για παράδειγμα, η εφαρμογή αποστολής μπορεί να σας πει ότι χρειάζεται:

new PermissionToken()
{
    Target = PermissionTokenTarget.Application,
    Action = PermissionTokenAction.View,
    Value = "ShippingApp"
};

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

Απαντήθηκε 04/08/2008 στις 19:03
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more