ACL

Dein Ziel ist es, dass nicht jeder das Recht hat, alles zu bearbeiten. Dazu bietet Joomla! eine Zugriffskontrollliste, die ACL. Mit dieser handhabst du Benutzerrechte in deiner Komponente.

Für Ungeduldige

Sieh dir den geänderten Programmcode in der Diff-Ansicht an und übernimm diese Änderungen in deine Entwicklungsversion.

// https://github.com/astridx/boilerplate/compare/t9...t10.diff

diff --git a/src/administrator/components/com_foos/access.xml b/src/administrator/components/com_foos/access.xml
new file mode 100644
index 00000000..fa1d9b04
-- /dev/null
++ b/src/administrator/components/com_foos/access.xml
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<access component="com_foos">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" />
		<action name="core.options" title="JACTION_OPTIONS" />
		<action name="core.manage" title="JACTION_MANAGE" />
		<action name="core.create" title="JACTION_CREATE" />
		<action name="core.delete" title="JACTION_DELETE" />
		<action name="core.edit" title="JACTION_EDIT" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" />
		<action name="core.edit.own" title="JACTION_EDITOWN" />
	</section>
</access>
diff --git a/src/administrator/components/com_foos/config.xml b/src/administrator/components/com_foos/config.xml
index bbd807ae..241609ff 100644
-- a/src/administrator/components/com_foos/config.xml
++ b/src/administrator/components/com_foos/config.xml
@@ -15,4 +15,19 @@
 			<option value="1">JYES</option>
 		</field>
 	</fieldset>
	<fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>
		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			validate="rules"
			filter="rules"
			component="com_foos"
			section="component"
		/>
	</fieldset>
 </config>
diff --git a/src/administrator/components/com_foos/foos.xml b/src/administrator/components/com_foos/foos.xml
index a9d7b587..da9849dc 100644
-- a/src/administrator/components/com_foos/foos.xml
++ b/src/administrator/components/com_foos/foos.xml
@@ -21,6 +21,11 @@
 			<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
 		</sql>
 	</uninstall>
	<update>  <!-- Runs on update -->
		<schemas>
			<schemapath type="mysql">sql/updates/mysql</schemapath>
		</schemas>
	</update>
 	<!-- Frond-end files -->
 	<files folder="components/com_foos">
 		<folder>language</folder>
@@ -38,6 +43,7 @@
 			<menu link="option=com_foos">COM_FOOS</menu>
 		</submenu>
 		<files folder="administrator/components/com_foos">
			<filename>access.xml</filename>
 			<filename>foos.xml</filename>
 			<filename>config.xml</filename>
 			<folder>forms</folder>
diff --git a/src/administrator/components/com_foos/forms/foo.xml b/src/administrator/components/com_foos/forms/foo.xml
index 827d7946..15615cf6 100644
-- a/src/administrator/components/com_foos/forms/foo.xml
++ b/src/administrator/components/com_foos/forms/foo.xml
@@ -25,5 +25,12 @@
 			size="45"
 			hint="JFIELD_ALIAS_PLACEHOLDER"
 		/>

		<field
			name="access"
			type="accesslevel"
			label="JFIELD_ACCESS_LABEL"
			size="1"
		/>
 	</fieldset>
 </form>
diff --git a/src/administrator/components/com_foos/sql/install.mysql.utf8.sql b/src/administrator/components/com_foos/sql/install.mysql.utf8.sql
index 634065b8..4c925493 100644
-- a/src/administrator/components/com_foos/sql/install.mysql.utf8.sql
++ b/src/administrator/components/com_foos/sql/install.mysql.utf8.sql
@@ -9,3 +9,7 @@ INSERT INTO `#__foos_details` (`name`) VALUES
 ('Nina'),
 ('Astrid'),
 ('Elmar');

ALTER TABLE `#__foos_details` ADD COLUMN  `access` int(10) unsigned NOT NULL DEFAULT 0 AFTER `alias`;

ALTER TABLE `#__foos_details` ADD KEY `idx_access` (`access`);
diff --git a/src/administrator/components/com_foos/sql/updates/mysql/10.0.0.sql b/src/administrator/components/com_foos/sql/updates/mysql/10.0.0.sql
new file mode 100644
index 00000000..fd5b6cc0
-- /dev/null
++ b/src/administrator/components/com_foos/sql/updates/mysql/10.0.0.sql
@@ -0,0 +1,3 @@
ALTER TABLE `#__foos_details` ADD COLUMN  `access` int(10) unsigned NOT NULL DEFAULT 0 AFTER `alias`;

ALTER TABLE `#__foos_details` ADD KEY `idx_access` (`access`);
diff --git a/src/administrator/components/com_foos/src/Model/FoosModel.php b/src/administrator/components/com_foos/src/Model/FoosModel.php
index 4767b474..0038575c 100644
-- a/src/administrator/components/com_foos/src/Model/FoosModel.php
++ b/src/administrator/components/com_foos/src/Model/FoosModel.php
@@ -48,9 +48,17 @@ protected function getListQuery()

 		// Select the required fields from the table.
 		$query->select(
			$db->quoteName(array('id', 'name', 'alias'))
			$db->quoteName(array('a.id', 'a.name', 'a.alias', 'a.access'))
 		);
		$query->from($db->quoteName('#__foos_details'));

		$query->from($db->quoteName('#__foos_details', 'a'));

		// Join over the asset groups.
		$query->select($db->quoteName('ag.title', 'access_level'))
			->join(
				'LEFT',
				$db->quoteName('#__viewlevels', 'ag') . ' ON ' . $db->quoteName('ag.id') . ' = ' . $db->quoteName('a.access')
			);

 		return $query;
 	}
diff --git a/src/administrator/components/com_foos/src/View/Foos/HtmlView.php b/src/administrator/components/com_foos/src/View/Foos/HtmlView.php
index 29a8871f..4748083d 100644
-- a/src/administrator/components/com_foos/src/View/Foos/HtmlView.php
++ b/src/administrator/components/com_foos/src/View/Foos/HtmlView.php
@@ -11,6 +11,7 @@

 \defined('_JEXEC') or die;

use Joomla\CMS\Helper\ContentHelper;
 use Joomla\CMS\Language\Text;
 use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
 use Joomla\CMS\Toolbar\Toolbar;
@@ -57,14 +58,21 @@ public function display($tpl = null): void
 	 */
 	protected function addToolbar()
 	{
		$canDo = ContentHelper::getActions('com_foos');

 		// Get the toolbar object instance
 		$toolbar = Toolbar::getInstance('toolbar');

 		ToolbarHelper::title(Text::_('COM_FOOS_MANAGER_FOOS'), 'address foo');

		$toolbar->addNew('foo.add');
		if ($canDo->get('core.create'))
		{
			$toolbar->addNew('foo.add');
		}

		$toolbar->preferences('com_foos');
		if ($canDo->get('core.options'))
		{
			$toolbar->preferences('com_foos');
		}
 	}

 }
diff --git a/src/administrator/components/com_foos/tmpl/foo/edit.php b/src/administrator/components/com_foos/tmpl/foo/edit.php
index 93e36b40..1531aec6 100644
-- a/src/administrator/components/com_foos/tmpl/foo/edit.php
++ b/src/administrator/components/com_foos/tmpl/foo/edit.php
@@ -27,6 +27,7 @@
 <form action="<?php echo Route::_('index.php?option=com_foos&layout=' . $layout . $tmpl . '&id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="foo-form" class="form-validate">
 	<?php echo $this->getForm()->renderField('name'); ?>
 	<?php echo $this->getForm()->renderField('alias'); ?>
	<?php echo $this->getForm()->renderField('access'); ?>
 	<input type="hidden" name="task" value="">
 	<?php echo HTMLHelper::_('form.token'); ?>
 </form>
diff --git a/src/administrator/components/com_foos/tmpl/foos/default.php b/src/administrator/components/com_foos/tmpl/foos/default.php
index f2c891bd..e597fc4c 100644
-- a/src/administrator/components/com_foos/tmpl/foos/default.php
++ b/src/administrator/components/com_foos/tmpl/foos/default.php
@@ -27,6 +27,9 @@
 								<th scope="col" style="width:1%" class="text-center d-none d-md-table-cell">
 									<?php echo Text::_('COM_FOOS_TABLE_TABLEHEAD_NAME'); ?>
 								</th>
								<th scope="col" style="width:10%" class="d-none d-md-table-cell">
									<?php echo TEXT::_('JGRID_HEADING_ACCESS') ?>
								</th>
 								<th scope="col">
 									<?php echo Text::_('COM_FOOS_TABLE_TABLEHEAD_ID'); ?>
 								</th>
@@ -47,6 +50,9 @@
 										<?php echo $editIcon; ?><?php echo $this->escape($item->name); ?></a>

 								</th>
								<td class="small d-none d-md-table-cell">
									<?php echo $item->access_level; ?>
								</td>
 								<td class="d-none d-md-table-cell">
 									<?php echo $item->id; ?>
 								</td>

Schritt für Schritt

Neue Dateien

src/administrator/components/com_foos/access.xml

Als Erstes legen wir alle möglichen Berechtigungen in einer XML-Datei fest.

src/administrator/components/com_foos/access.xml

<?xml version="1.0" encoding="utf-8"?>
<access component="com_foos">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" />
		<action name="core.options" title="JACTION_OPTIONS" />
		<action name="core.manage" title="JACTION_MANAGE" />
		<action name="core.create" title="JACTION_CREATE" />
		<action name="core.delete" title="JACTION_DELETE" />
		<action name="core.edit" title="JACTION_EDIT" />
		<action name="core.edit.state" title="JACTION_EDITSTATE" />
		<action name="core.edit.own" title="JACTION_EDITOWN" />
	</section>
</access>

src/administrator/components/com_foos/sql/updates/mysql/10.0.0.sql

Die Berechtigungen bestehen permanent und werden in der Datenbank gespeichert.

Bei einem Update sind ausschließlich die Änderungen relevant. Diese tragen wir in diese Datei diese ein. Bei einer neuen Installation wird die Datenbank über die Hauptdatei administrator/components/com_foos/sql/install.mysql.utf8.sql gleich korrekt eingerichtet.

src/administrator/components/com_foos/sql/updates/mysql/10.0.0.sql

ALTER TABLE `#__foos_details` ADD COLUMN  `access` int(10) unsigned NOT NULL DEFAULT 0 AFTER `alias`;

ALTER TABLE `#__foos_details` ADD KEY `idx_access` (`access`);

Geänderte Dateien

src/administrator/components/com_foos/config.xml

Die Berechtigungen für die gesamte Komponente stellen wir in der Konfiguration ein. Hierfür legen wir ein Feld an.

src/administrator/components/com_foos/config.xml

...
  <fieldset
		name="permissions"
		label="JCONFIG_PERMISSIONS_LABEL"
		description="JCONFIG_PERMISSIONS_DESC"
		>
		<field
			name="rules"
			type="rules"
			label="JCONFIG_PERMISSIONS_LABEL"
			validate="rules"
			filter="rules"
			component="com_foos"
			section="component"
		/>
	</fieldset>
...

src/administrator/components/com_foos/foos.xml

Damit bei der Installation alles glatt läuft, ergänzen wir die hier neu hinzukommenden Dateien.

https://github.com/astridx/boilerplate/blob/4efa6681475e12a48143acc126358a0f36fd8452/src/administrator/components/com_foos/foos.xml

...
	<update>  <!-- Runs on update -->
		<schemas>
			<schemapath type="mysql">sql/updates/mysql</schemapath>
		</schemas>
	</update>
...
	<files folder="components/com_foos">
			<filename>access.xml</filename>
...

src/administrator/components/com_foos/forms/foo.xml

Das Formular zum Erstellen eines neuen Foo-Items wird um die Möglichkeit erweitert, Berechtigungen für ein einzelnes Element zu setzten.

src/administrator/components/com_foos/forms/foo.xml

...
  <field
		name="access"
		type="accesslevel"
		label="JFIELD_ACCESS_LABEL"
		size="1"
	/>
...

src/administrator/components/com_foos/sql/install.mysql.utf8.sql

Das SQL-Skript für die Installation wird ebenfalls um die notwendigen Felder erweitert.

src/administrator/components/com_foos/sql/install.mysql.utf8.sql

...
ALTER TABLE `#__foos_details` ADD COLUMN  `access` int(10) unsigned NOT NULL DEFAULT 0 AFTER `alias`;

ALTER TABLE `#__foos_details` ADD KEY `idx_access` (`access`);

src/administrator/components/com_foos/src/Model/FoosModel.php

Wenn du mit SQL bisher nicht vertraut bist, dann wird die Datenbankabfrage für dich komplex. Es ist jetzt erforderlich, Daten aus zwei Datenbanktabellen zu kombinieren. Die Tabelle, die die Berechtigungen von com_user verwaltet #__viewlevels, und die unsere Beispielkomponenete.

src/administrator/components/com_foos/src/Model/FoosModel.php

...
$query->select($db->quoteName('ag.title', 'access_level'))
			->join(
				'LEFT',
				$db->quoteName('#__viewlevels', 'ag') . ' ON ' . $db->quoteName('ag.id') . ' = ' . $db->quoteName('a.access')
      );
...

Zur Erinnerung: Joomla unterstützt dich beim Erstellen der Datenbankabfragen. Wenn du die zur Verfügung stehenden Anweisungen nutzt, dann kümmert sich Joomla für dich um Sicherheit oder unterschiedliche Syntax in PostgreSQL und MySQL.

(https://docs.joomla.org/Accessing_the_database_using_JDatabase/de)

src/administrator/components/com_foos/src/View/Foos/HtmlView.php

Eine Schaltfläche zum Erstellen eines Elementes ist nur sinnvoll, wenn dies erlaubt ist. Deshalb ändern wir die View ab.

src/administrator/components/com_foos/src/View/Foos/HtmlView.php

...
  $canDo = ContentHelper::getActions('com_foos');
...
	if ($canDo->get('core.create'))
	{
		$toolbar->addNew('foo.add');
	}
...

src/administrator/components/com_foos/tmpl/foo/edit.php

Der Eintrag <?php echo $this->getForm()->renderField(‚access‘); ist notwendig, damit das Feld im Formular aufgenommen wird, welches wir in er XML Datei schon konfiguriert haben. Nur so ist es möglich, die Berechtigungen pro Element zu verändern.

src/administrator/components/com_foos/tmpl/foo/edit.php

...
	<?php echo $this->getForm()->renderField('access'); ?>
...

src/administrator/components/com_foos/tmpl/foos/default.php

Last but not least nehmen wir für die Anzeige der Berechtigung eine Spalte in der Übersicht auf.

src/administrator/components/com_foos/tmpl/foos/default.php

...
	<th scope="col" style="width:10%" class="d-none d-md-table-cell">
		<?php echo TEXT::_('JGRID_HEADING_ACCESS') ?>
	</th>
...
	<td class="small d-none d-md-table-cell">
  	<?php echo $item->access_level; ?>
	</td>
...

Teste deine Joomla-Komponente

  1. Installiere deine Komponente in Joomla! Version 4, um sie zu testen:

Kopiere die Dateien im administrator Ordner in den administrator Ordner deiner Joomla! 4 Installation.
Kopiere die Dateien im components Ordner in den components Ordner deiner Joomla! 4 Installation.
Kopiere die Dateien im media Ordner in den media Ordner deiner Joomla! 4 Installation.

Installiere deine Komponenten wie in Teil eins beschrieben, nachdem du alle Dateien kopiert hast. Joomla! aktualisiert bei der Installation die Datenbank für dich.

  1. Erstelle in deiner Komponente ein neues Item. Überzeuge dich davon, dass dir ein Auswahlfeld für das Speichern einer Berechtigung angeboten wird. Der Wert, den du hier eingibst, wird mit dem Element gespeichert und ist bei der Anzeige in einer Liste abfragbar.

Joomla! Konfiguration

  1. Zur besseren Übersicht wird der Wert in der Hauptansicht angezeigt.

Joomla! Konfiguration

  1. Öffne die Optionen. Hier hast du die Möglichkeit, die Berechtigungen für die Nutzung der Komponente selbst zu setzten.

Joomla! Konfiguration

Spiele mit den Einstellungen herum. Erlaube einmal nur dem Super Admin, neue Elemente in deiner Erweiterung zu erstellen. Melde dich dann als Administrator an und sieh, dass die Schaltfläche New verschwunden ist.

Geänderte Dateien

Übersicht

Vor oder zurück ...