Zugriffsbeschränkung durch .htaccess- und .htpasswd-Datein
Über das CMS können pro Pool jeweils eine .htaccess- sowie .htpasswd-Datei angelegt werden, um den Zugriff auf die Datein in diesem Pool zu beschränken.
Aktivierung
Um die Dateien im CMS überhaupt anlegen zu können, müssen die objectTypes der .htaccess- und .htpasswd-Dateien erst einmal ein oder mehreren groupTypes zugewiesen werden. Dies geschieht in der groupTypes.json. Die namen der hinzuzufügenden objectTypes lauten “htaccess” und “htpasswd”.
In folgendem Beispiel wurden diese objectTypes der “contentGroup” hinzugefügt. So kann dann in jedem Content-Pool eine .htaccess-Datei und eine .htpasswd-Datei angelegt werden.
{
...
"contentGroup": {
"order" : 10,
"id": "contentGroup",
"name": "Inhaltsseiten",
"parentGroupTypes" : [
"micrositeRubricGroup",
"rubricGroup",
"serviceGroup",
"contentGroup"
],
"protectable" : true,
"objectTypes" : {
"content" : ":objectTypes.content",
"externalPage" : ":objectTypes.externalPage",
"htaccess" : ":objectTypes.htaccess", <----- hier eingefügt -------
"htpasswd" : ":objectTypes.htpasswd" <----------------------------
},
"steps": {
"articlePoolSettings" : ":steps.articlePoolSettings"
}
},
...
}
Die .htpasswd-Datei
Im Template der .htpasswd-Datei können alle zugelassenen Benutzer samt deren Passwörter angegeben werden. Die Passwörter werden über den UNIX-crypt-Algorithmus verschlüsselt.
Template: template\sectionTypes\htpasswd.spml
<h1>Zugangsdaten für geschützte Bereiche</h1>
<div class="editorblock">
<h2>Nutzer und Passwörter</h2>
<div class="info">Hier können frei Zugangsdaten für einen
geschützten Bereich angelegt werden.</div>
<div class="fieldsetbody">
<spt:iterator name="sp_userlist">
Login:<br>
<spt:text name="sp_login" size="50" />
<br>
Password:<br>
<spt:text name="sp_password" size="50" />
</spt:iterator>
</div>
</div>
Aggregator: aggregator\sectionTypes\htpasswd.spml
<sp:set name="_content">
<sp:loop collection="_itemScope.sp_userlist" item="it"><sp:print name="it.sp_login"/>:<sp:print name="it.sp_password" encrypt="unixcrypt"/>
</sp:loop>
</sp:set>
<%--
Generiert die .htpasswd-Datei
--%>
<sp:map name="_data" action="put" key="text" object="_content.trim"/>
Die .htaccess-Datei
Im Template der .htaccess-Datei muss auf die .htpasswd-Datei verwiesen werden. Optional kann man einen Titel für das Anmeldefenster festlegen, den Zugriffsschutz auf ausgewählte Datein im Pool beschränken sowie zusätzliche eigene Regeln in die .htaccess-Datei schreiben.
Template: template\sectionTypes\htaccess.spml
<div class="editorblock">
<h2>Grundkonfiguration</h2>
<div class="info">Damit die Regeln auf dem Webserver korrekt
funktionieren sind hier einige Angaben notwendig.</div>
<div class="fieldsetbody">
<%--
<strong>Apache Version</strong><br>
<sp:select name="sp_apache_version" style="width:300px">
<sp:option value=""> < 2.4</sp:option>
<sp:option value="2.4"> >= 2.4</sp:option>
</sp:select>
<br><br>
--%>
<strong>Optionale, globale Regeln (z.B. require ip 127.0.0.1)</strong><br>
<spt:textarea name="sp_htaccess" rows="7" cols="50" />
<br>
<br> <strong>Datei mit den Zugangsdaten</strong><br>
<spt:link name="sp_passwd" pools="!{internetwebsite}" />
<br>
<br> <strong>Pfad zum DocumentRoot auf dem Webserver
(z.B. /var/www)</strong><br>
<spt:text name="sp_documentroot" size="50" /> </div>
</div>
<div class="editorblock">
<h2>Titel des geschützten Bereichs</h2>
<div class="info">Dieser wird im Login-Dialog angezeigt.</div>
<div class="fieldsetbody">
<spt:text name="sp_title" size="50" value="Authentifizierung notwendig"/>
</div>
</div>
<div class="editorblock">
<h2>Dateien, die geschützt werden sollen</h2>
<div class="info">
Hier können Sie Dateien innerhalb <strong>dieses Pools</strong>
auswählen, für die ein Zugriffsschutz gelten soll. Wird keine Datei
ausgewählt ist der gesamte Pool vor Zugriffen geschützt.
</div>
<spt:iterator name="sp_protectedfiles">
<spt:link name="sp_file" pools="${parent}" showtree="false" />
</spt:iterator>
</div>
Aggregator: aggregator\sectionTypes\htaccess.spml
<sp:set name="_content">
AuthType Basic
AuthName "<sp:print name="_itemScope.sp_title"/>"
AuthUserFile <sp:print name="sp_documentroot" /><sp:print name="_itemScope.sp_passwd.link.url"/>
#AuthGroupFile /dev/null<sp:condition><sp:if name="sp_protectedfiles.filledItems.size" eq="0">
require valid-user<sp:if name="sp_htaccess">
<sp:print name="sp_htaccess"/></sp:if></sp:if><sp:else><sp:loop collection="sp_protectedfiles.filledItems" item="it">
<Files "<sp:print name="it.sp_file.link.relativeUrl"/>">
require valid-user<sp:if name="sp_htaccess">
<sp:print name="sp_htaccess"/></sp:if>
</Files></sp:loop></sp:else></sp:condition>
</sp:set>
<%--
Generiert die .htaccess-Datei
--%>
<sp:map name="_data" action="put" key="text" object="_content.trim"/>
objectType-aggregator
Als Aggregator für die entsprechenden objectTypes der .htacces- und .htpasswd-Datein wurde nicht aggregator\main.spml
verwendet,
da kein normales PHP-Objekt wie für die meisten Artikel erzeugt werden soll, sondern aggregator\text.spml
,
der eigentlich dafür gemacht wurde, Plain-Text zu erzeugen.