Eigene Berechtigungen erstellen

Das Zuweisen von Berechtigungen ist in Sitecore, wie in den meisten anderen Content Management Systemen eine grundlegende Funktion. Enwickler sollten keine redaktionellen Inhalte verändern, SEO Spezialisten lediglich suchmaschinenrelevante Informationen befüllen und Redakteure einen exklusiven Freigabemechanismus besitzen.
Von Sitecore 6.6 auf 7.x sind noch weitere Berechtigungen hinzugekommen, wie beispielsweise das Anlegen eines Item Buckets.

Kann man dann eigene Berechtigungen hinzufügen? Eine sehr rar dokumentierte Erweiterungsmöglichkeit innerhalb von Sitecore.

Kleines Fallbeispiel:
Wir besitzen nun eine bestimmte Autoren-Rolle, welche Komponenten auf einer Seite hinzufügen, verschieben und löschen darf – jedoch nicht die hinterlegte Datenquelle verändern.

Sublayout Rendering Options

Damit wir nun diese einfach klingende Anforderung lösen können, werden wir eine neue Berechtigungsart „Set Datasource“ hinzufügen, welche wir pro Sublayout setzen können. Wenn wir Berechtigungen für das setzen der Datenquelle haben, erscheint im Page-Editor der entsprechende Button – andernfalls wird er nicht angezeigt.

1. Berechtigungsart erstellen

In der web.Config unter ..\sitecore\accessrights\rights\ finden wir die Berechtigungen, welche im System angezeigt werden. Standardmässig erben die Sitecore-Berechtigungen von der Klasse Sitecore.Security.AccessControl.AccessRight. Benötigt man mehr Funktionalität, kann bei jeder Berechtigungsart auch ein separater Typ mit dem Attribute ‚type=“…“‚ angegeben werden. Es empfiehlt sich von „AccessRights“ zu erben und somit die Funktionalität nur zu erweitern.

Für unser Beispiel erstellen wir also nun eine neue Berechtigungsart, ohne erweiterte Funktionalität. Geben einen eigenen Namen, kommentieren die Funktionalität und setzen einen Titel für die Darstellung im Sitecore UI:

<rights defaultType="Sitecore.Security.AccessControl.AccessRight, Sitecore.Kernel">
        <add name="sublayout:SetDatasource" comment="Can set an individual Datasource" modifiesData="true" title="Set Datasource" />
        ...
        ...
      </rights>

2. Regelwerk definieren

Als notwendiger Schritt, muss nun noch definiert werden, auf welcher Art von Items die Berechtigung benutzt werden soll. Auch hier gibt es wieder einige Möglichkeiten, welche auch mit eigenen Klassen nochmals erweitert werden können. Defaultmässig greift der Typ Sitecore.Security.AccessControll.AccessRightRule

Das Regelwerk ist direkt unter den „Rights“ im Node ..\sitecore\accessrights\rules\ zufinden.

Für unsere Anforderung definieren wir alle Items, welche vom Template des SubLayouts sind als gültige Elemente um die oben definierte Berechtigung anwenden zu können:

      <rules>
        <add prefix="sublayout:" templateId="{0A98E368-CDB9-4E1E-927C-8E0C24A003FB}" comment="sublayout:show for Sublayout template" />
        ...
        ...
      </rules>

3. Berechtigung setzen
Nun können wir bereits in den Access-Viewer von Sitecore wechseln und die gewünschten Berechtungen setzen. Wenn die Berechtigung noch nicht angezeigt wird, muss sie im Ribbon unter „Columns“ noch angewählt werden. Standardmässig werden nur ein Teilset von Berechtigungen präsentiert.

sc_security_2

4. Buttons
Nach dem Setzen der Berechtigungen müssen wir uns nur noch darum kümmern, dass die einzelnen Buttons auch auf diese neue Berechtigung reagieren.

Jene Buttons, welche bei einer Komponente angezeigt werden, befinden sich in der Sitecore-Core-Datenbank unter /sitecore/content/Applications/WebEdit/Default Rendering Buttons/. Für unser Fallbeispiel interessiert uns nun der „Set datasource“ Button im Speziellen. Der Wert des „Click“-Properties sollte nun auf eine neue Definition verändert werden. Beispielsweise my:setdatasource

sc_security_buttons-customizing_2-5

Damit hinter diesem Begriff eine Funktionalität gesteckt werden kann, muss dieser zuerst in der Commands.config (zufinden unter App_Config) registriert werden. Hier kann nach dem vorherigen Begriff „webedit:setdatasource“ suchen, den ensprechenden Eintrag duplizieren, mit einem eigenen Typ und dem vorherig gesetzten Click-Namen versehen:

    <command name="my:setdatasource" type="Namics.TestSitecore7.WebApp.Commands.SetDatasource"/>

Was uns nun noch fehlt, ist der (noch) nicht existierende Typ. Hierfür erstellen wir eine Klasse im enstprechenden Namensraum und erben von der Basisklasse Sitecore.Shell.Applications.WebEdit.Commands.SetDatasource

Damit wir nun die Command-Elemente aktivieren/deaktivieren können, überschreiben wir die entsprechende QueryState-Methode und Fragen die zuvor erstelle Berechtigung explizit ab.

    [Serializable]
    public class SetDatasource : Sitecore.Shell.Applications.WebEdit.Commands.SetDatasource
    {
        public override CommandState QueryState(CommandContext context)
        {
            Assert.ArgumentNotNull(context, "context");
            string renderingId = context.Parameters["renderingId"];

            if (!string.IsNullOrEmpty(renderingId))
            {
                var renderingItem = Context.Item.Database.GetItem(new ID(renderingId));
                if (renderingItem != null)
                {
                    if (
                        !AuthorizationManager.IsAllowed(
                            renderingItem, AccessRight.FromName("sublayout:SetDatasource"), Context.User))
                    {
                        return CommandState.Hidden;
                    }
                }
            }

            return base.QueryState(context);
        }
    }

Wenn ich nun als Author mit deaktivierten „Set Datasource“-Berechtigung auf meine Komponente klicke, sehe ich den Button nicht mehr und kann ihn somit nicht mehr anwählen.

sc_security_rendering_3

Fazit
Dieses Beispiel sollte die Flexibilität der Berechtigungsstruktur von Sitecore zeigen. Es ist somit möglich, eigene Berechtigungsarten zu erstellen und bestehende oder neue Komponenten damit zu steuern. Anpassungsfähiger kann man kaum sein! 😉

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>