cancel
Showing results for 
Search instead for 
Did you mean: 

Share Oberfläche Repository-Button verbergen

tschaaf
Champ in-the-making
Champ in-the-making
Hallo zusammen,

ich bin momentan noch recht neu in Alfresco und stoße dabei immer wieder an Probleme.

Im Moment suche ich einen Weg den Repository Button auf der Share-Oberfläche für bestimmte Benutzer zu verbergen, bzw. nur für eine bestimmte Gruppe von Personen anzeigen zu lassen.

Während dies für den Create Site Button sowohl im Header als auch auf dem Dashlet Meine Seite, sehr einfach war, finde ich keinen Weg dies für den Repository Button nachzustellen.

Ich kann zwar einschränken, dass der Repository Button nur noch für Administratoren angezeigt wird, aber ich möchte nicht jeden der diesen Button sehen soll zum Administrator machen müssen.

Leider gibt es jedoch keine .ftl und .js Datei die ich wie für den Create Site Button einfach anpassen könnte, sondern lediglich in der shared-confix.xml einen Eintrag für das entsprechende "item" des Repository Button.

Bis auf die Variante mit dem permission="admin" hab ich keine Variante gefunden um die Anzeige zu verhindern.

Vielleicht lässt es sich über die conditions in Freemarker definieren?

Würde mich über Lösungsvorschläge freuen.
11 REPLIES 11

afaust
Legendary Innovator
Legendary Innovator
Hallo,

für diesen Anwendungsfall würde ich den Ansatz mit dem permission Konfigurationsparameter weiter verfolgen. Leider gibt es im Standard nur die Werte guest und admin, was für diesen Fall nicht ausreicht. Man könnte aber die Möglichkeiten erweitern, wenn man in der header.get.js in der Funktion getHeader() Anpassungen vornimmt, die z.B. auf Basis von Gruppenzugehörigkeiten oder tatsächlich im Repository hinterlegten Berechtigungen weitere Werte zur Verfügung stellt. Hierzu sind dann allerdings remote-Aufrufe des Repository notwendig, die ggf. die Performance beeinträchtigen können, wenn aufwändige Berechnungen / Datenbankzugriffe mit unzureichenden Caching durchgeführt werden.

Gruß
Axel

deas0815
Star Contributor
Star Contributor
das site-unabhängige Rollenmodell none, guest, user und admin ist in Spring-Surf "hart verdrahtet". Es zu erweitern ist schon ein bischen Aufwand. Habe das mal gemacht um zwischen internen Usern (Active Directory) und Externen (Alfresco DB) Usern zu differenzieren.

Natürlich kann man einfach in den Templates etwas nach gewissen Kriterien ausblenden. Aber wirklich sicher ist das so vor bösen Usern eben nicht.

Gruß
Andreas

thomash
Champ in-the-making
Champ in-the-making
Hallo,
Am Rollenmodell des Surf Frameworks rumzufummeln würde ich dir nicht empfehlen wenn du nicht wirklich eine neue Rolle brauchst.
Am Ende musst daran denken das du oder jemand anderes die Änderung ja auch noch warten und upgraden muß.
Du hattest erwähnt das verbergen ausreicht da gibt es ne halbwegs einfache Möglichkeit.

Das Repository Item in der share-config.xml bringt ein condition Attribut mit das sich für solche Geschichten nutzen lässt.
<item type="link" id="repository" condition="conditionRepositoryRootNode">/repository</item>

Diese Condition benennt den Freemarker Ausdruck conditionRepositoryRootNode der auf true/false geprüft wird und damit steuert ob der Button angezeigt wird.
Dies geschieht in einem Freemarker Template in der header Komponente von Share. Du findest Sie unter share\WEB-INF\classes\alfresco\site-webscripts\org\alfresco\components\header\header.inc.ftl
<#assign conditionRepositoryRootNode = ((config.scoped["RepositoryLibrary"]["root-node"].getValue())!"") != "">

Ein einfaches ändern (testweise) in <#assign conditionRepositoryRootNode = false> würde den Button bereits ausblenden.

Um das ganze sauber zu machen legst du im Share Extension Verzeichnis unterhalb von shared/classes/web-extension den Pfad site-webscripts/org/alfresco/components/header/ an und kopierst die header.inc.ftl da rein. Nun wird Sie aus diesem Verzeichnis abgefragt.
Nun musst du lediglich noch eine Abfrage einbauen die abprüft ob der user entweder ein admin ist und eine damit den Button selbstverständlich sehen soll, oder über ein bestimmtes Attribut oder eine bestimmte Berechtigung verfügt.
Ich halte persönlich nicht viel von irgendwelche Gruppen in ein Freemarker Template hart reinzucoden. Ich würde deswegen einen Aspekt bauen den du auf ein User Objekt anwenden kannst und und dessen Existenz du abfragen kannst.
Ist der Aspekt da wird der Button eingeblendet, ist er nicht da dann nicht.

Gruß
Thomas

deas0815
Star Contributor
Star Contributor
Hi Thomas,

sicher ist es aus Wartungsgründen nicht schön selbst das Surf Rollenmodell zu erweitern.

Wartung ist aber wie "echte" Sicherheit auch etwas was gegen die von dir skizzierte Lösung spricht. Smiley Happy

Ich persönlich würde mich wundern warum ich mal user.isAdmin oder user.isGuestUser - ditto Authentication Elemente im XML, und außerdem noch andere Konstrukte sehe die im Grunde dem selben Zweck dienen.

Sicher gibt es einen guten Grund warum Webscripts dieses fixe Modell hat.

Weißt du, warum das so ist ?
Vielleicht weil historisch aus den dem Repo Code gewachsen ?

"Selbst" JEE kennt analog isUserInRole(…) schon seit jeher.

Gruß
Andreas

thomash
Champ in-the-making
Champ in-the-making
Sicherheit ja, allerdings sehe ich beim Zugriff auf den Repository Button nun wirklich keine sicherheitstechnische Relevanz, zumal der darüber zugreifbare Content über Berechtigungen geschützt werden kann.
Das gesamte Authentifizierungskonzept im Webscript Framework dient nicht dazu API Zugriffe mit Berechtigungen zu versehen, denn genau das ist es was du hier vorschlägst.
Die Berechtigungen hängen vielmehr am Content und da gehören Sie auch hin. Stattdessen wird durch diesen Mechanismus die Authentifizierung beim API Zugriff auf einem gewissen Niveau Erzwungen für mehr war es auch nie gedacht.
Es ist natürlich Schade das es leider nicht wirklich einfach erweiterbar ist, sollte aber ursprünglich so einfach wie möglich konzipiert sein und lediglich diese Minimalfunktionalität "Sicherstellung einer vorhandenen Authentifizierung" umsetzen.

Wenn ich ehrlich bin hab ich in den seltensten Fällen mehr gebraucht, eigentlich nur einmal und da gabs auch noch andere Möglichkeiten.

jpfi_4454
Champ in-the-making
Champ in-the-making
Moin Jungs,
na, dann lasst uns diesen Thread mal weiter diskutieren ;-):

Thomas hat Recht. Permissions gehören an Content, aber Imho gibt es manchmal Anforderungen wo ich ganze Seiten/Pages von Surf/Share für bestimmte Gruppen/Rollen nicht zugreifbar machen will. D.h. es gibt zwei Baustellen über die man nachdenken sollte:
1. Ausblenden der Links auf die Page.
2. Anzeigen einer Meldung falls ein nicht zugelassener Benutzer direkt die URL der Page aufruft

Beides ist speziell mit den neuen Möglichkeiten in 4.0 wirklich kein großes Thema mehr. Man sollte aber auf ein paar Dinge achten:
- die Gruppen/Rollen Mitgliedschaften sollten nicht zu oft abgefragt werden (Caching, context.properties etc.)
- benutzen des Config-Service um die Gruppen/Rollen nicht an x-Stellen hart zu codieren

Der Repository Button ist hier der simpelste Fall.

cheers, Jan

lotharmärkle
Champ in-the-making
Champ in-the-making
Um nochmal auf eine konkrete Lösung zurückzukommen. Ich habe die Aufgabe "Verberge dies und das in share für user xy, oder die Gruppe abc" durch einfaches css gelöst:

1. Im HTML Grundgerüst Template org/alfresco/include/alfresco-template.ftl ein CSS kurz vor dem <body> als ein WebScript eingebunden.

<!– css global overrides –>
   <link rel="stylesheet" type="text/css" href="${url.context}/service/ecm4u/custom/overrides.css"/>
</head>

2.  Das Share Webscript overrides bekommt einen JS Controller overrides.get.js

model.hideRepositoryNavigation = ganzKomplizierteBerechnungHier();

3. im freemarker css template overrrides.get.css.ftl

<#if hideRepositoryNavigation>
#global_x002e_header_x0023_default-app_repository {
   display:none;
}
</#if>

Das Konzept lässt sich natürlich auch auf diverse andere Elemente der Seite übertragen. Einen kleine Trick braucht es noch, damit man CSS als WebScript rendern lassen kann. Dafür muss man css in der bean webscripts.formatmap konfigurieren. Ein Schnipsel-Beispiel wie man das bean überschreibt auf share seite. Das kann man sogar vielleicht noch weglassen, wenn man das CSS als "overrides.html" im Css-Tag einbindet.


<bean id="webscripts.formats" parent="webscripts.formatmap">
      <property name="formats">
         <props>
            <prop key="css">text/css</prop>
….
   

Prinzipiell einfach, wenn man ein Template-Überschreiben akzeptieren möchte - die eine Zeile geht für mich gerade noch unter minimal invasiv durchSmiley Wink. Leider gibt es da imo kein Component um ein override.css per extension config reinzuhängen.

Grüße,
  lothar

jpfi_4454
Champ in-the-making
Champ in-the-making
Hi,
ja, aber jetzt hast du nur den Fall 1) erledigt, wenn ein findiger Benutzer die URL der Repository-Page findet (weil er bspw. die Hilfe liest), dann kann er die Seite noch immer aufrufen.
Das muss nicht schlimm sein, aber sollte jedem bewusst sein.
VG, Jan

deas0815
Star Contributor
Star Contributor
Hallo zusammen,

ich denke der Thread hier zeigt auf, daß Bedarf besteht Spring Surf/-Webscripts in Punkto Sicherheit zu verbessern, oder ?

Der Ansatz etwas mittels templating conditionals  auszublenden reicht für diverse (gar nicht weit hergeholte) Anforderungen einfach nicht aus und ist auch technisch nicht immer sauber  - wenn z.B. vorher "überflüssigerweise" Controller Code läuft.

Und ja, mann kann einige Sicherheits-Themen mit ACLs abbilden und erschlagen. Aber es gibt durchaus auch Dinge (Rollen ! Smiley Wink, die sich nicht sinnvoll auf CRUD ACL Security reduzieren lasssen.

Was solls : Nobody is perfect !

Natürlich geht heute mit Modulen und Evaluatorn da mehr als früher. Das ist aber eben nicht konsistent analog admin oder user die ich auch in templates und den XML Descriptoren verwenden kann. Ich würde es einfach gut finden, wenn Webscripts/Surf konsistent für beliebige Rollen angepasst wird.

Ich habe fertig.

Gruß
Andreas