Path-Based Authorization

Both Apache and svnserve are capable of granting (or denying) permissions to users. Typically this is done over the entire repository: a user can read the repository (or not), and she can write to the repository (or not). It's also possible, however, to define finer-grained access rules. One set of users may have permssion to write to a certain directory in the repository, but not others; another directory might not even be readable by all but a few special people.

Both servers use a common file format to describe these path-based access rules. In the case of Apache, one needs to load the mod_authz_svn module and then add the AuthzSVNAccessFile directive (within the httpd.conf file) pointing to your own rules-file. (For a full explanation, see “Adgangskontroll på katalognivå”.) If you're using svnserve, then you need to make the authz-db variable (within svnserve.conf) point to your rules-file.

Once your server knows where to find your rules-file, it's time to define the rules.

Syntaksen til fila er den samme kjente som brukes av svnserve.conf og konfigurasjonsfilene som brukes under kjøring. Linjer som starter med en hash (#) ignoreres. I sin enkleste form navngir hver seksjon et depot og en sti i det, og de autentiserte brukernavnene er valgnavnene innenfor hver seksjon. Verdien til hvert valg beskriver brukerens adgangsnivå til depotstien: Enten r (kun lesing) eller rw (både skriving og lesing). Hvis brukeren ikke nevnes i det hele tatt, gis ingen tilgang i det hele tatt.

For å være mer spesifikk: Verdien til seksjonsnavnene er enten på formen [depotnavn:sti] eller på formen [sti]. Hvis du bruker SVNParentPath-direktivet, er det viktig å spesifisere depotnavnet i seksjonene dine. Hvis du utelater dem, vil en seksjon som [en/katalog] samsvare med stien en/katalog i hvert eneste depot. Hvis du bruker imidlertid bruker SVNPath-direktivet, er det greit å bare definere stier i seksjonene dine — når alt kommer til alt, finnes det bare ett depot.

[calc:/branches/calc/bug-142]
harry = rw
sally = r

I dette første eksempelet har brukeren harry full lese- og skrivetilgang i katalogen /branches/calc/big-142 i calc-depotet, men brukeren sally har kun lesetilgang. Alle andre brukere nektes tilgang til depotet.

Alle tilganger arves selvfølgelig fra foreldrekataloger til underkataloger. Dette betyr at vi kan spesifisere en underkatalog med en forskjellig adgangsregel for Sally:

[calc:/branches/calc/bug-142]
harry = rw
sally = r

# gi sally skrivetilgang kun til underkatalogen «testing»
[calc:/branches/calc/bug-142/testing]
sally = rw

Nå kan Sally skrive til underkatalogen testing på grenen, men kan fortsatt bare lese andre deler. Imens fortsetter Harry å ha både lese- og skrivetilgang til hele grenen.

Det er også mulig å eksplisitt nekte adgang til noen ved hjelp av arveregler, ved å sette brukernavnvariabelen til ingenting:

[calc:/branches/calc/bug-142]
harry = rw
sally = r

[calc:/branches/calc/bug-142/hemmelig]
harry =

I dette eksempelet har Harry både lese- og skrivetilgang til hele bug-142-treet, men har absolutt ingen tilgang i det hele tatt til underkatalogen hemmelig innenfor det.

Tingen å huske på er at den mest spesifikke stien alltid samsvarer først. Serveren prøver å få selve stien til å stemme, deretter forelderen til stien, så forelderen til den, og så videre. Netteffekten er at det å nevne en spesifikk sti i aksessfila alltid vil overstyre alle rettigheter som er arvet fra foreldrekataloger.

Som standard har ingen noen tilgang til depotet i det hele tatt. Det betyr at hvis du starter med en tom fil, vil du sannsynligvis ønske å i det minste gi leserettigheter til alle brukere ved roten av depotet. Du kan gjøre dette ved å bruke asteriskvariabelen (*), som betyr “alle brukere”:

[/]
* = r

Dette er et vanlig oppsett; legg merke til at det ikke nevnes noen depotnavn i seksjonsnavnet. Dette gjør alle depotene fullstendig lesbare for alle brukerne. Når alle brukerne har lesetilgang til depotene, kan du gi eksplisitt lese/skrive-rettigheter til visse brukere i spesifikke underkataloger inne i spesifikke depoter.

Asteriskvariabelen (*) er også verdt litt spesiell omtale her: Det er det eneste mønsteret som samsvarer med en anonym bruker. Hvis du har satt opp serverblokken din til å tillate en blanding av anonym og autentisert tilgang, starter alle brukere med å kommunisere anonymt. Serveren ser etter en *-verdi for stien som blir aksessert; hvis den ikke finner noen, forlanger den skikkelig autentisering fra klienten.

Aksessfila lar deg også definere hele grupper med brukere, ganske likt /etc/group på Unix-systemer:

[groups]
calc-utviklere = harry, sally, joe
paint-utviklere = frank, sally, jane
alle = harry, sally, joe, frank, sally, jane

Grupper kan bli gitt tilgang akkurat som brukere. Skill mellom dem ved å sette en krøllalfa (@) foran gruppenavnet:

[calc:/prosjekter/calc]
@calc-utviklere = rw

[paint:/prosjekter/paint]
@paint-utviklere = rw
jane = r 

Grupper kan også bli definert til å inneholde andre grupper:

[groups]
calc-utviklere = harry, sally, joe
paint-utviklere = frank, sally, jane
alle = @calc-utviklere, @paint-utviklere

…og det er omtrent det som er å si om den saken.



[41] A common theme in this book!