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.