{"id":7427,"date":"2021-09-20T10:03:14","date_gmt":"2021-09-20T08:03:14","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=7427"},"modified":"2021-09-20T10:03:16","modified_gmt":"2021-09-20T08:03:16","slug":"ldap-gruppen-in-hcl-connections-angepasster-jsp-auslesen-und-menueeintraege-nur-fuer-gruppenmitglieder-anzeigen","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/ldap-gruppen-in-hcl-connections-angepasster-jsp-auslesen-und-menueeintraege-nur-fuer-gruppenmitglieder-anzeigen\/","title":{"rendered":"LDAP-Gruppen in HCL Connections angepasster JSP auslesen und Men\u00fceintr\u00e4ge nur f\u00fcr Gruppenmitglieder anzeigen"},"content":{"rendered":"<p>M\u00f6chtest du mithilfe von zentralen LDAP-Gruppen bestimmte Anpassungen innerhalb von Connections vornehmen? Dann bist du hier richtig: Dieser Artikel zeigt, wie sich alle Gruppen in denen ein Nutzer Mitglied ist, per Java in den JSPs (z.B. <strong>header.jsp<\/strong>) auslesen lassen. Damit ist es m\u00f6glich, HCL Connections anzupassen. Beispielsweise kann man einzelne Men\u00fceintr\u00e4ge nur f\u00fcr Mitglieder einer Gruppe anzeigen.<\/p>\n<p>Hierf\u00fcr habe ich mir ein JSP Codeschnipsel erstellt:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-java\" data-line=\"\">&lt;%@ page import=&quot;com.ibm.websphere.security.cred.WSCredential&quot; %&gt;\n&lt;%@ page import=&quot;com.ibm.websphere.security.auth.WSSubject&quot; %&gt;\n&lt;%@ page import=&quot;javax.security.auth.Subject&quot; %&gt;\n&lt;%@ page import=&quot;java.util.Iterator&quot; %&gt;\n&lt;%@ page import=&quot;java.util.List&quot; %&gt;\n&lt;%@ page import=&quot;java.util.ArrayList&quot; %&gt;\n&lt;%@ page import=&quot;java.util.Set&quot; %&gt;\n\n&lt;%\nString userName = WSSubject.getCallerPrincipal();\nSubject subject = WSSubject.getCallerSubject();\nSet credSet = subject.getPublicCredentials(WSCredential.class);\nIterator iter = credSet.iterator();\nWSCredential creds = (WSCredential) iter.next();\nList credsList = creds.getGroupIds();\nList&lt;String&gt; lowerGroupNames = new ArrayList();\n\nSystem.out.println(&quot;--------------------------------------------&quot;);\nSystem.out.println(&quot;Members [by header.jsp] for user = &quot; + userName);\nfor(Object rawGroup:credsList){\n    String groupName = rawGroup.toString().split(&quot;\/&quot;)[1];\n    groupName = groupName.split(&quot;,&quot;)[0]\n        .split(&quot;=&quot;)[1];\n    System.out.println(&quot;Group: &quot; + groupName);\n    lowerGroupNames.add(groupName.toLowerCase());\n}\nSystem.out.println(&quot;--------------------------------------------&quot;);\n%&gt;\n<\/code><\/pre>\n<p>Es lie\u00dft alle Gruppen des Benutzers aus und schreibt diese in die <strong>SystemOut.log<\/strong> Datei. Wobei dessen Lokation von der jeweiligen App abh\u00e4ngt, die wir aufrufen. Beispiel: Wikis liegt im <strong>AppsCluster<\/strong>, somit finden wir die Logs dort &#8211; etwa unter <strong>\/opt\/IBM\/WebSphere\/AppServer\/profiles\/CnxNode01\/logs\/AppsCluster_server1\/SystemOut.log<\/strong>. Wird auf der Startseite (Homepage) getestet, befindet sich die Anwendung im <strong>UtilCluster <\/strong>und somit in <strong>UtilCluster_server1<\/strong>.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-java\" data-line=\"\">[8\/30\/21 15:21:01:950 UTC] 00000133 SystemOut     O --------------------------------------------\n[8\/30\/21 15:21:01:950 UTC] 00000133 SystemOut     O Members [by header.jsp] for user = max\n[8\/30\/21 15:21:01:950 UTC] 00000133 SystemOut     O Group: cnx-tester\n[8\/30\/21 15:21:01:950 UTC] 00000133 SystemOut     O --------------------------------------------<\/code><\/pre>\n<p>Dies nur als Unterst\u00fctzung zum Testen. In der Praxis m\u00f6chten wir nat\u00fcrlich eher etwas ausf\u00fchren, wenn eine Gruppenmitgliedschaft vorliegt (oder eben nicht). Mein Code erzeugt eine ArrayList <strong>lowerGroupNames<\/strong>. Dar\u00fcber l\u00e4sst sich unabh\u00e4ngig von der Schreibweise Im Java-Code pr\u00fcfen, ob eine gewisse Gruppe vorhanden ist:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-java\" data-line=\"\">boolean canUseTestFeatures = lowerGroupNames.contains(&quot;cnx-tester&quot;);\nSystem.out.println(&quot;IsTester: &quot; + canUseTestFeatures);\nSystem.out.println(&quot;--------------------------------------------&quot;);<\/code><\/pre>\n<p>Um damit nun dynamisches HTML zu erzeugen, werden JSF (JavaServer Faces) ben\u00f6tigt. Diese k\u00f6nnen erst genutzt werden, wenn die Bibliothek eingebunden ist. Im Beispiel der <strong>header.jsp<\/strong> also nach folgender Zeile:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-java\" data-line=\"\">--%&gt;&lt;%@ taglib prefix=&quot;c&quot;        uri=&quot;http:\/\/java.sun.com\/jsp\/jstl\/core&quot; %&gt;&lt;%--<\/code><\/pre>\n<p>Variablen aus dem Java-Code sind hier nicht automatisch verf\u00fcgbar, sondern m\u00fcssen zun\u00e4chst gesetzt werden.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-java\" data-line=\"\">&lt;c:set var=&quot;lowerGroupNames&quot; value=&quot;&lt;%=lowerGroupNames%&gt;&quot; \/&gt;\n&lt;b style=&quot;color:red; margin-left:15px;&quot;&gt;\n        &lt;c:choose&gt;\n            &lt;c:when test=&#039;${fn:contains(lowerGroupNames, &quot;cnx-tester&quot;)}&#039;&gt;\n                Du bist ein Tester! :)\n            &lt;\/c:when&gt;\n            &lt;c:otherwise&gt;\n                Leider bist du noch kein Tester :\/\n            &lt;\/c:otherwise&gt;\n        &lt;\/c:choose&gt;\n&lt;\/b&gt;\n\n&lt;%\n<\/code><\/pre>\n<p>Damit erzeugen wir links oben in der Navigation einen unsch\u00f6nen, aber als POC ausreichenden Text, abh\u00e4ngig davon ob der Benutzer Mitglied in der LDAP-Gruppe <strong>cnx-tester<\/strong> ist.<\/p>\n<h2 class=\"wp-block-heading\">Anpassen des Header-Men\u00fcs: Eintrag nur f\u00fcr Mitglieder einer Gruppe anzeigen<\/h2>\n<p>Mein prim\u00e4rer Anwendungsfall daf\u00fcr war: Wir haben neue, experimentelle Funktionen, die wir zwar gerne als Link in das Men\u00fc einbinden m\u00f6chten. Doch vorerst soll nicht jeder die Links sehen, sodass wir dies nach erfolgreichen Tests erst f\u00fcr alle Verf\u00fcgbar machen k\u00f6nnen. Dazu erstellen wir <strong>${SHARED_DIRECTORY}\/customization\/common\/nav\/templates\/menu<\/strong> und kopieren <strong>apps.jsp<\/strong> aus einer beliebigen Anwendung (z.B. Wikis) dort hinein:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">mkdir \/opt\/IBM\/shared\/customization\/common\/nav\/templates\/menu\ncp \/opt\/IBM\/WebSphere\/AppServer\/profiles\/CnxNode01\/installedApps\/CnxCell\/Wikis.ear\/wikis.web.war\/nav\/templates\/menu\/apps.jsp \/opt\/IBM\/shared\/customization\/common\/nav\/templates\/menu<\/code><\/pre>\n<p><strong>\/opt\/IBM\/shared\/customization\/common\/nav\/templates\/menu\/apps.jsp<\/strong> kann nun mit einem Texteditor ge\u00f6ffnet werden, um Anpassungen vorzunehmen. In diesem Falle m\u00f6chte ich ein Element an das Ende setzen, also suche ich den schlie\u00dfenden Tag der Tabelle:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-java\" data-line=\"\">--%&gt;&lt;\/table&gt;&lt;\/div&gt;&lt;%--<\/code><\/pre>\n<p>Davor laden wir die Gruppen des Benutzers und binden eine neue Zeile ein, falls er in unserer Testgruppe Mitglied ist. Damit es ansprechender aussieht, kommt ein Icon des Herstellers zum Einsatz und es wird ein kleiner roter NEU Banner angef\u00fcgt.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-java\" data-line=\"\">&lt;%--\n Custom navigation: Show new boards only for members of the tester group\n--%&gt;\n&lt;%@ page import=&quot;com.ibm.websphere.security.cred.WSCredential&quot; %&gt;\n&lt;%@ page import=&quot;com.ibm.websphere.security.auth.WSSubject&quot; %&gt;\n&lt;%@ page import=&quot;javax.security.auth.Subject&quot; %&gt;\n&lt;%@ page import=&quot;java.util.Iterator&quot; %&gt;\n&lt;%@ page import=&quot;java.util.List&quot; %&gt;\n&lt;%@ page import=&quot;java.util.ArrayList&quot; %&gt;\n&lt;%@ page import=&quot;java.util.Set&quot; %&gt;\n\n&lt;%\nString userName = WSSubject.getCallerPrincipal();\nSubject subject = WSSubject.getCallerSubject();\nSet credSet= subject.getPublicCredentials(WSCredential.class);\nIterator iter= credSet.iterator();\nWSCredential creds = (WSCredential) iter.next();\nList credsList = creds.getGroupIds();\nList&lt;String&gt; lowerGroupNames = new ArrayList();\n\nfor(Object rawGroup:credsList){\n    String groupName = rawGroup.toString().split(&quot;\/&quot;)[1];\n    groupName = groupName.split(&quot;,&quot;)[0]\n        .split(&quot;=&quot;)[1];\n    lowerGroupNames.add(groupName.toLowerCase());\n}\n%&gt;\n\n\n&lt;c:set var=&quot;lowerGroupNames&quot; value=&quot;&lt;%=lowerGroupNames%&gt;&quot; \/&gt;\n&lt;c:if test=&quot;${fn:contains(lowerGroupNames, &#039;cnx-tester&#039;)}&quot;&gt;\n                &lt;tr&gt;\n                  &lt;th scope=&quot;row&quot; class=&quot;lotusNowrap&quot;&gt;\n                        &lt;img src=&quot;data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8\/9hAAAFCnpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjarVdtkuuqDvzPKu4SEAIkloP5qLo7eMu\/jcFO4jgzJ6deXGMBFiC6G8GY9r9\/u\/kHP0fRGR9EY4rR4ueTTy6joHb+piXr9\/eq2KPw0m7ODw5NDMuzGtvyz2gPjw7iV\/        +++v22m6krHF0DXSMvAbkMbNDYfnpGojdbKdVN2n1y\/5pOeuPZR\/idL7WvQCMGtDIzrjGxBbvOGbh8UecYRVv5uFELCh7Tvub77EzZ\/EC3lm6YGfzaudXKIyNyyFeMFrtFO6x2xG6sHbM\/PIhbFbs8+8Ju96r9t7m6rKPQCqatahjKXsJjhugnGhEPIK\/                                                                                         +++gLLsT8KjWGIB6BVsbniKoUQOaHfyVClTp7bbQgUhetecwDpXwMFoUxaXXOFBgR8PdSegoRqw47iANUazO2Ohfd60z1dIMXMleDrCYIQeb4+5a\/yb5xyo9yFdIqsnVojLDQEijMHceMMLhFBfmIYd3\/0xT7qxT8QyGAw7zIoFZrvNIbZAD23xzjPDL1hv7JQ7SV0DACLMHRAMMRiwkThQJCvOCRFwVPCTEblj7zYwQCG4SqaDG+YIctSNudFHaPd1wc1mpBYQEThiq+     +++jYKCDL+wD9iFdoKAcO3oQQYpCgIYUcOfoYYowSR47KwuIlSBQRlSRZWb0GjSqqmjQnlxgpLKSYxCRNKeWMSTOGzuid4ZHz5jbe\/Ba2uMmmW9pygXyKL6HEIkVLKrm6yhXbv8YqpmpNNTdqkFLzLbTYpGlLLXdorXP3PfTYpWtPPZ+sLVZfWaMLcz+zRou1wZjf\/eTBGppFjiFopJMwOANjzhMYl8EABO0GZ1bJezeYG5zZ5LApggNrFAY5lQZjYNA3cqHTyd2DuR95M8F\/ +++xZv7xJwZ1P0\/mDODusXcO283rNW8nyi8EzR24cDUckdig0PT7DSPM+nedsS3F3vJpW\/IavsX+2TNteHWcgtpL249eG4jwV1nNH8dwsUa90ch\/R6i+SqUpMgvPoyT9mrNpw\/3Vt9BwE1mFE3uOLy7yiNo6GgGDRW19ujh7Wr3gpWVuta2+Y7D4wp2WYOoot\/F9dUzy4hw7C5PLY7Ehpo01Ovb+pFGSh3F0DNOPNsEEvazQ4hSy3MHs\/                             +++doSstBmxTsBZ7VmJrodXhdg9HodnqaO1c\/lV5guZSDxeL79lkX5pNQcp0AtVa6LZUXXLbxmysPCx3htN7sT54uT6Q0IZP5hVpCJvZ+IjLucOYo\/GzHHW\/HoqbUvN6IyuyFbbkFKi3IjM0if84wkbHP4ML8GJBe05JKc7ZHNe6XDHK1ta3uxXbGRWXV2JTu38TWapxM1bEFGqelzCa+R6T2Gb5CiwfhtJkliqrQJ25As1YktaRfbUMzRvvzwajmQ+sQPhfhw9sgN+       +++MuOBfVrW\/plIcsJQL2grveWq12rvx1qsWFcXbPlUtzdY8rbO9piVY+CoATp+PeqXpshpnGHn40F2RDKm2tjYrk\/LUgf7Oxr4jAKo7JlSSi4qJWV6Tx8A1lagD3a4ssshATxkGXp7K\/zvy31rzx4yblOHATAlzpteA\/Jv+juA3UfSfua24\/UvvHlG6+21vrrKq4065dxm4GYZ72vseNqBzKRYbe\/Fs2KUdqbVml8LnVejC8aMPdtMuXtKOw4sVe+                    +++3gSxpUWtfyG2xv9H4H8E2u+SWq3oaxIzP1d4\/vQzF+H8DJz76Zij5v\/AK4ZC0T5k1m1AAAABmJLR0QA\/wD\/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5QgeDzEtgjVXBgAAAWlJREFUOMul0z9rFUEUBfDfxMVCiTaC4CNBCLEPCNpYGET9ACkFmydb5gsEK+1MYSVLxMovYBOSxhQKFgFTKqhpQnwqSIrElz9PMha7L7s7aEQ8MMWZO+          +++dw586cIEEsTCHHNCar7Q94iSLk1prnQ0N4Co\/RdTyeYjbk+kcGlXiJcM1fEeEVbg9NxMJCLMS4vhpbSPlWL8bCcC3ASHXnrn9HNxamsmpgJb68ax9J+c731CTPqmmX6PdY36zLZy+y8ZrBXslPjqYG01njqdjbZvNBXb7ygo1lfiyVvDOXGkyO+E9k+IQJcLjLpUd19fMqnZu4UfKD3VT\/PsObI4PePL1GuTPHzwH72yU\/M5YaLGZ4hjt\/                         +++7PHrSj0DrRkM8CQLuZVYWMat3xqcv87+5bqD+pEehtzH4Ve+UF1lvK0+QTjd4IfEnWEe7oW8HaZxPMdxeejjPuZDnqSxMoEZ3MVVnMMB3mKxivO3puYX3dKOKWGlWaAAAAAASUVORK5CYII=&quot; \/&gt;\n                        &lt;a href=&quot;\/boards\/auth\/connections&quot;&gt;\n                          &lt;strong&gt;Boards&lt;\/strong&gt;\n                          &lt;span class=&quot;kudos-new&quot;&gt;NEU&lt;\/span&gt;\n                          &lt;style&gt;\n                                  .kudos-new{\n                                        position: absolute;\n                                        right: -5px;\n                                        top: 0;\n                                        background: red;\n                                        text-align: center;\n                                        border-radius: 1px 1px 1px 1px;\n                                        color: white;\n                                        font-size: 10px;\n                                        padding: 1px !important;\n                                  }\n                          &lt;\/style&gt;\n                        &lt;\/a&gt;\n                  &lt;\/th&gt;\n                &lt;\/tr&gt;\n        &lt;\/c:if&gt;&lt;%--\n--%&gt;&lt;\/table&gt;&lt;\/div&gt;&lt;%--<\/code><\/pre>\n<p>Bei einem Tester (= Mitglied der Gruppe) sieht das so aus:<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-57.png\"><img loading=\"lazy\" decoding=\"async\" width=\"956\" height=\"363\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-57.png\" alt=\"\" class=\"wp-image-7428\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-57.png 956w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-57-300x114.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-57-768x292.png 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-57-70x27.png 70w\" sizes=\"auto, (max-width: 956px) 100vw, 956px\" \/><\/a><\/figure>\n<p>Ein anderer Benutzer, der kein Mitglied dieser Gruppe ist, sieht dagegen das 0815 Standard-Men\u00fc:<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-58.png\"><img loading=\"lazy\" decoding=\"async\" width=\"442\" height=\"321\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-58.png\" alt=\"\" class=\"wp-image-7429\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-58.png 442w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-58-300x218.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-58-70x51.png 70w\" sizes=\"auto, (max-width: 442px) 100vw, 442px\" \/><\/a><\/figure>\n<p><strong>Achtung:<\/strong> Die Anwendungsnavigation wird per Ajax nachgeladen! Meiner Erfahrung nach cachen viele Browser das sehr aggressiv. Ihr aktualisiert also die Seite und seht das alte Men\u00fc &#8211; obwohl ihr den CNX Debugmodus aktiviert bzw. neu gestartet habt. Daher solltet ihr mit F12 die Entwicklerkonsole \u00f6ffnen und dort <strong>Cache deaktivieren<\/strong> anhaken. So lange die Konsole ge\u00f6ffnet ist, bleibt dies aktiv. Ihr k\u00f6nnt sie verkleinern bzw. in einem neuen Fenster \u00f6ffnen und minimieren, falls sie im Weg ist.<\/p>\n<h2 class=\"wp-block-heading\">Erweiterungen: Lokalisierung + Untereintr\u00e4ge<\/h2>\n<p>Obiges Beispiel ist zur reinen Demonstration in Ordnung. F\u00fcr den Praxiseinsatz sollten noch zwei weitere Dinge eingebaut werden:<\/p>\n<h3 class=\"wp-block-heading\">1. Lokalisierung<\/h3>\n<p>Zumindest wenn ihr Connections im internationalen Raum einsetzt oder dies vorhabt, sollten Texte nicht hartkodiert eingebaut werden. Stattdessen die in CNX eingebaute Lokalisierung verwenden, die sich auch mit eigenen Sprachschnipseln anpassen l\u00e4sst. Im Falle von Boards haben wir die sogar bereits, sofern das alte WebSphere-Boards installiert ist. Dann k\u00f6nnen wir Zeile 1 durch Zeile 2 ersetzen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-xml\" data-line=\"\">&lt;strong&gt;Boards&lt;\/strong&gt;\n&lt;strong&gt;&lt;fmt:message key=&quot;connections.component.name.kudos.boards&quot; \/&gt;&lt;\/strong&gt;<\/code><\/pre>\n<p>F\u00fcr das &#8222;NEU&#8220; Badge m\u00fcsste jedoch eine eigene Lokalisierung erzeugt werden, sofern man dies nicht einheitlich &#8222;NEW&#8220; oder \u00e4hnlich bezeichnen kann.<\/p>\n<h3 class=\"wp-block-heading\">2. Untergeordnete Eintr\u00e4ge hinzuf\u00fcgen<\/h3>\n<p>Auf den obigen Screenshots sieht unser eigener Eintrag leer aus, da er in der von Connections vorgesehenenen zweiten und dritten Ebene nichts enth\u00e4lt. Falls untergeordnete Links f\u00fcr euren Anwendungsfall Sinn machen, w\u00fcrde ich diese einbauen. Im Beispiel des neuen, docker-basierten Boards k\u00f6nnten wir einen Direktlink zum gewohnten Aufgaben-Board einbauen. Dazu einfach ein td Element unter th einbauen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-xml\" data-line=\"\">&lt;\/th&gt;\n&lt;td class=&quot;lotusNowrap lotusLastCell&quot;&gt;\n      &lt;a href=&quot;\/boards\/todos\/kanban\/assigned&quot;&gt;\n        &lt;fmt:message key=&quot;label.menu.kudos.boards.todos&quot; \/&gt;\n      &lt;\/a&gt;\n&lt;\/td&gt;\n<\/code><\/pre>\n<p>Nat\u00fcrlich k\u00f6nnten wir das auch hier hart kodieren statt mit <strong>&lt;fmt:message<\/strong> zu lokalisieren, wobei letzteres zu bevorzugen w\u00e4re. Als Ergebnis haben wir in beiden F\u00e4llen einen zweiten Link, neben dem Hauptelement:<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-59.png\"><img loading=\"lazy\" decoding=\"async\" width=\"433\" height=\"355\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-59.png\" alt=\"\" class=\"wp-image-7430\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-59.png 433w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-59-300x246.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-59-70x57.png 70w\" sizes=\"auto, (max-width: 433px) 100vw, 433px\" \/><\/a><\/figure>\n<p>Bei Bedarf kann man mit einem entsprechenden weiteren &lt;td&gt; Element auch die dritte Ebene f\u00fcllen.<\/p>\n<h2 class=\"wp-block-heading\">Neues Anwendungsmen\u00fc f\u00fcr alle sichtbar, die berechtigt sind? Die verschiedenen Ebenen des Caches<\/h2>\n<p>Auch wenn die Frage trivial erscheint, hat sich dies bei meinen Tests als nicht so einfach erwiesen. Es gibt Caching auf verschiedenen Ebenen. Teils serverseitig, abh\u00e4ngig vom Browser wird zudem clientseitig ebenfalls zwischengespeichert.<\/p>\n<h3 class=\"wp-block-heading\">1. WAS Authentifizierungscache<\/h3>\n<p>WebSphere speichert Authentifizierungsdaten zwischen. Standardm\u00e4\u00dfig f\u00fcr 10 Minuten, es scheint sich um <strong>Global Security &gt; Authentication cache settings<\/strong> zu handeln:<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-63.png\"><img loading=\"lazy\" decoding=\"async\" width=\"477\" height=\"288\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-63.png\" alt=\"\" class=\"wp-image-7443\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-63.png 477w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-63-300x181.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-63-70x42.png 70w\" sizes=\"auto, (max-width: 477px) 100vw, 477px\" \/><\/a><\/figure>\n<p>Damit neue Einstellungen wirksam werden, nach dem Speichern eine vollst\u00e4ndige Neusynchronisation aller Nodes durchf\u00fchren und die Nodes neu starten.<\/p>\n<h3 class=\"wp-block-heading\">2. JSP-Cache<\/h3>\n<p>Die JSPs selbst (zumindest jene vom Layout wie header.jsp) werden nicht bei jedem Seitenaufruf ausgef\u00fchrt. Stattdessen scheint es hier einen Zwischenspeicher zu geben, der beim neu einloggen geleert wird. Oder beim serverseitigen Neustart. Dadurch kann folgendes Szenario entstehen: Ihr habt eingebaut, dass etwas bestimmtes f\u00fcr Mitglieder der Gruppe X erscheint, entsprechend neu gestartet. Ein Nutzer der kein Mitglied dieser Gruppe ist, ruft Connections auf. Danach nehmt ihr ihn in Gruppe X auf. Wenn als Authentifizierungscache der Standard von 10 Minuten eingestellt ist, sieht dieser Nutzer die Berechtigungen durch die neue Gruppe <strong>nicht<\/strong> nach 10 Minuten, da das Ergebnis der JSP bereits zwischengespeichert ist und der Code daher nicht neu ausgef\u00fchrt wird. Die \u00c4nderung wird erst sichtbar, wenn der Nutzer sich neu einloggt.<\/p>\n<h3 class=\"wp-block-heading\">3. Browser-Cache<\/h3>\n<p>Zus\u00e4tzlich haben wir im Falle der Navigation noch einen dritten Cache, der sich au\u00dferhalb des Servers befindet: Das Anwendugnsmen\u00fc wird nicht zusammen mit dem Hauptdokument gerendert, sondern per Ajax nachgeladen. Viele Browser speichern diese Anfragen ebenfalls gesondert zwischen. Dadurch kann es sein, dass serverseitig nun zwar alle \u00c4nderungen \u00fcbernommen wurden. Aber der Browser trotzdem die alten Navigationseintr\u00e4ge aus seinem Cache zeigt.<\/p>\n<h3 class=\"wp-block-heading\">Was kann man gegen diese Flut an Caches tun?<\/h3>\n<p>Das in meinen Augen beste was man tun kann ist, den Zeitstempel zu erh\u00f6hen zusammen mit einem Neustart. Der Zeitstempel kommt als Caching-Burster an verschiedenen Stellen zum Einsatz und soll den Browser-Cache aktualisieren. Dazu \u00f6ffnet man eine wsadmin Konsole und f\u00fchrt folgende Befehle aus, wobei der Zielordner <strong>\/tmp\/checkout<\/strong> zuvor h\u00e4ndisch angelegt werden muss:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-python\" data-line=\"\">execfile(&quot;connectionsConfig.py&quot;)\nLCConfigService.checkOutConfig(&quot;\/tmp\/checkout&quot;, AdminControl.getCell())\nLCConfigService.updateConfig(&quot;versionStamp&quot;,&quot;&quot;)\nLCConfigService.checkInConfig()\nsynchAllNodes()<\/code><\/pre>\n<p>Anschlie\u00dfend alle AppServer bzw. den kompletten Node\/die Nodes neu starten. Je nach verwendetem Browser reicht das clientseitig oder es muss ggf. dieser neu gestartet werden bzw. das l\u00f6schen vom Cache ist erforderlich.<\/p>\n<h2 class=\"wp-block-heading\">Tipp: Anwendungsmen\u00fc dauerhaft sichtbar machen<\/h2>\n<p>Da das Anwendungsmen\u00fc nur beim \u00fcberfahren mit der Maus sichtbar ist, gestaltet sich das Testen im Browser als schwierig. Ich benutze gerne die Entwicklerkonsole, um Kleinigkeiten auszuprobieren. Das k\u00f6nnen wir mit etwas CSS einfacher gestalten: Entwicklerkonsole mit F12 \u00f6ffnen und links oben nach <strong>#lotusBannerApps_dropdown<\/strong> suchen.<\/p>\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-61.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"238\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-61-1024x238.png\" alt=\"\" class=\"wp-image-7432\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-61-1024x238.png 1024w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-61-300x70.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-61-768x179.png 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-61-1536x357.png 1536w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-61-70x16.png 70w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-61.png 1905w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<p>(1) Ist das Element, welches ihr nun finden solltet und (2) dessen CSS. Falls es nicht angezeigt wird, zun\u00e4chst auf das HTML-Element links klicken. Unter dem Selektor <strong>Element<\/strong> den Haken bei <strong>display: none<\/strong> entfernen. Durch die Positionierung ben\u00f6tigt es noch eine Positionsangabe, um sichtbar zu werden. Im einfachsten FAlle klicken wir neben das Semikolon des letzten Elements und f\u00fcgen <strong>top: 42px<\/strong> hinzu:<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-62.png\"><img loading=\"lazy\" decoding=\"async\" width=\"157\" height=\"117\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-62.png\" alt=\"\" class=\"wp-image-7434\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-62.png 157w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-62-70x52.png 70w\" sizes=\"auto, (max-width: 157px) 100vw, 157px\" \/><\/a><\/figure>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-60.png\"><img loading=\"lazy\" decoding=\"async\" width=\"699\" height=\"357\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-60.png\" alt=\"\" class=\"wp-image-7436\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-60.png 699w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-60-300x153.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2021\/08\/grafik-60-70x36.png 70w\" sizes=\"auto, (max-width: 699px) 100vw, 699px\" \/><\/a><\/figure>\n<p>Wer es exakt so positionieren m\u00f6chte wir es sp\u00e4ter aussehen wird, f\u00fcgt noch <strong>left: 555.5px<\/strong> hinzu und geht bei <strong>top<\/strong> auf <strong>42.6333px<\/strong>. Das wird aber dynamisch berechnet, m\u00f6glicherweise sieht es bei euch mit anderen Aufl\u00f6sungen etwas anders aus. Wobei ich das mangels <em>richtiger <\/em>Responsiveness eher nicht erwarten w\u00fcrde.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>M\u00f6chtest du mithilfe von zentralen LDAP-Gruppen bestimmte Anpassungen innerhalb von Connections vornehmen? Dann bist du hier richtig: Dieser Artikel zeigt, wie sich alle Gruppen in denen ein Nutzer Mitglied ist, per Java in den JSPs (z.B. header.jsp) auslesen lassen. Damit ist es m\u00f6glich, HCL Connections anzupassen. Beispielsweise kann man einzelne Men\u00fceintr\u00e4ge nur f\u00fcr Mitglieder einer &#8230;<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[765],"tags":[929,926,928,609],"class_list":["post-7427","post","type-post","status-publish","format-standard","hentry","category-hcl-connections","tag-anpassung","tag-customization","tag-gruppen","tag-ldap"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7427","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=7427"}],"version-history":[{"count":7,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7427\/revisions"}],"predecessor-version":[{"id":7582,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7427\/revisions\/7582"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=7427"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=7427"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=7427"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}