Hva er den beste måten å håndtere flere tillatelsestyper?

stemmer
17

Jeg ofte støter på følgende scenario der jeg trenger å tilby mange forskjellige typer tillatelser. Jeg bruker primært ASP.NET / VB.NET med SQL Server 2000.

scenario

Jeg ønsker å tilby et dynamisk tillatelse system som kan fungere på ulike parametre. La oss si at jeg ønsker å gi enten en avdeling eller bare en bestemt person tilgang til et program. Og late som vi har en rekke programmer som fortsetter å vokse.

I det siste har jeg valgt en av følgende to måter som jeg kjenner til å gjøre dette.

  1. Bruk en enkelt tillatelse bord med spesielle kolonner som brukes for å bestemme en hvordan du skal bruke parametrene. De spesielle kolonner i dette eksemplet er TypeID og TypeAuxID. SQL ville se noe som dette.

    SELECT COUNT(PermissionID)
    FROM application_permissions
    WHERE
    (TypeID = 1 AND TypeAuxID = @UserID) OR
    (TypeID = 2 AND TypeAuxID = @DepartmentID)
    AND ApplicationID = 1
    
  2. Bruk en kartlegging tabell for hver type tillatelse, så bli med dem alle sammen.

    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
    

Mine tanker

Jeg håper at eksemplene fornuftig. Jeg brosteinbelagte dem sammen.

Det første eksempelet krever mindre arbeid, men ingen av dem føler at det beste svaret. Finnes det en bedre måte å håndtere dette?

Publisert på 04/08/2008 klokken 17:46
kilden bruker
På andre språk...                            


5 svar

stemmer
10

Jeg er enig med John Downey.

Personlig, jeg bruker ofte en flagget opplisting av tillatelser. På denne måten kan du bruke AND, OR, NOT og XOR bitvis operasjoner på telling objekter.

"[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
}"

Deretter kan du kombinere flere tillatelser ved hjelp av OG bitvis operatør.

For eksempel, hvis en bruker kan se og redigere brukere, er det binære resultatet av operasjonen er 0000 0011 som konverterte til desimal er 3.
Du kan deretter lagre tillatelse fra én bruker til en enkelt kolonne i databasen (i vårt tilfelle ville det være 3).

Inne søknaden din, trenger du bare en bitvis operasjon (OR) for å verifisere om en bruker har en spesiell tillatelse eller ikke.

Svarte 04/08/2008 kl. 18:23
kilden bruker

stemmer
10

Slik jeg vanligvis gå om koding tillatelsessystemer er å ha 6 bord.

  • Brukere - dette er ganske rett frem er det den typiske brukere tabellen
  • Gruppene - dette ville være synonymt med avdelingene
  • Roller - dette er en tabell med alle tillatelser som regel også inkludert en lesbar navn og en beskrivelse
  • Users_have_Groups - dette er en mange-til-mange-tabell over hvilke grupper en bruker tilhører
  • Users_have_Roles - en mange-til-mange tabell over hvilke roller er tildelt en individuell bruker
  • Groups_have_Roles - endelig mange-til-mange tabell over hvilke roller hver gruppe har

I begynnelsen av en brukere sesjon vil du kjøre noen logikk som trekker ut hver rolle de har tildelt, enten katalog eller gjennom en gruppe. Så du koden mot de rollene som sikkerhetstillatelser.

Som jeg sa dette er hva jeg vanligvis gjør, men din millage kan variere.

Svarte 04/08/2008 kl. 17:56
kilden bruker

stemmer
2

Ærlig ASP.NET Medlemskap / Roller funksjoner vil fungere perfekt for scenariet du beskrev. Skrive dine egne tabeller / procs / klasser er en stor oppgave, og du kan få veldig fin kontroll over små detaljer, men etter å ha gjort dette selv jeg har konkludert med at det er bedre å bare bruke den innebygde .NET ting. Mye av eksisterende kode er designet for å omgå det som er fint i tillegg. Skriftlig fra scratch tok meg ca 2 uker, og det var ikke hvor nær så robust som .NETs. Du må kode så mye dritt (passordgjenoppretting, auto lockout, kryptering, roller, en tillatelse grensesnitt, tonnevis av procs, etc) og tiden kunne vært bedre brukt andre steder.

Beklager hvis jeg ikke svare på spørsmålet ditt, jeg liker fyren som sier å lære c # når noen spør en vb spørsmålet.

Svarte 07/08/2008 kl. 02:23
kilden bruker

stemmer
2

I tillegg til John Downey og jdecuyper løsninger, har jeg også lagt til en "Explicit Deny" litt på slutten / begynnelsen av bitfield, slik at du kan utføre additive tillatelser etter gruppe, rolle medlemskap, og deretter trekke tillatelser basert på eksplisitt nekte oppføringer, mye som NTFS fungerer, tillatelse-messig.

Svarte 04/08/2008 kl. 18:39
kilden bruker

stemmer
0

En tilnærming jeg har brukt i ulike applikasjoner er å ha en generisk PermissionToken klasse som har en foranderlig verdi eiendom. Deretter kan du spørre den forespurte programmet, den forteller deg hvilke PermissionTokens er nødvendig for å kunne bruke den.

For eksempel kan Shipping programmet fortelle deg det er behov for:

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

Dette kan selvsagt bli utvidet til å opprette, redigere, slette osv, og på grunn av den tilpassede Verdi eiendom, kan hvilket som helst program, modul eller widget definere sine egne nødvendige tillatelser. YMMV, men dette har alltid vært en effektiv metode for meg som jeg har funnet for å skalere godt.

Svarte 04/08/2008 kl. 18:03
kilden bruker

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