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=""> &lt; 2.4</sp:option>
        <sp:option value="2.4"> &gt;= 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.