2015-12-21 11 views
5

Ich muss meinen Liferay-Benutzern Rollen zuweisen, wenn sie sich in der Anwendung anmelden.Rolle Benutzer in Liferay programmgesteuert hinzufügen

Ich habe implementiert die gesamte Logik in der ‚authenticateByScreenName‘ Methode einer benutzerdefinierten Klasse, die ‚Authenticator‘ implementiert.

Beispielcode:

public class ESBAuthenticator implements Authenticator{ 

     public int authenticateByScreenName(long companyId, String screenName, String password, 
      Map<String, String[]> headerMap, Map<String, String[]> parameterMap) 

       setProfile(companyId, screenname); 
       return 1; 
    } 

    public static void setProfile(long companyId, long userId){ 
      User user = UserLocalServiceUtil.getUser(userId); 
      Role liferayRole = RoleLocalServiceUtil.fetchRole(companyId, "Administrator"); 
      RoleLocalServiceUtil.addUserRole(user.getUserId(), liferayRole.getRoleId()); 
      UserLocalServiceUtil.updateUser(user); 
    } 
} 

Wenn ich log-in, anscheinend funktioniert es, ich Prüftabellen der liferay Datenbank und werden aktualisiert, mein Benutzer hat „Administrator“ Rolle zugewiesen. Das Portal im Front-End zeigt jedoch nicht die Option "Admin".

enter image description here

Aber wenn ich auf 'Mein Konto' gehen, drücken Sie die Schaltfläche 'Speichern', log-out und melden Sie sich wieder habe ich die Admin-Optionen availables.

Wer weiß, warum dies passiert ?, Ich rufe "updateUser()" nach der Rolle zuweisen, ist es nicht das gleiche wie die Schaltfläche "Speichern"?

Mögliche Lösung: Ich habe festgestellt, dass, wenn ich den Inhalt über den Cluster zwischengespeichert löschen, funktioniert es gut. Ich fand es in diesem Beitrag:

https://www.liferay.com/es/web/kamesh.sampath1/blog/-/blogs/how-to-clear-liferay-cache

Fügen Sie die folgende Zeile ein:

MultiVMPoolUtil.clear(); 

Wer weiß, ob dies die richtige Lösung ist ?, Ich kann nicht finden, was liferay tut, wenn die „save "Schaltfläche von der Seite" my_account "wird gedrückt. Vielleicht löschen Sie diesen Cache ?. Ich suchte nach einer Synchronisation mit der Datenbankfunktion, konnte aber nichts finden. Es scheint zu sein, dass, wenn eine Spalte aktualisiert wird, liferay es nicht verwenden, wenn es zwischengespeichert :(

+0

Ist es Pre-Authenticator oder Post-Authenticator? Ich glaube, wenn sein Post-Authenticator dann Benutzer-Kontext nicht mit Administratorrechten aktualisiert wird. –

+0

Es ist Pre-Authenticator: S. – dgcipp

+2

Versuchen Sie 'UserLocalServiceUtil.addRoleUser (long roleId, long userId)' stattdessen! –

Antwort

0

Ich kann Ihnen einen billigen Hack geben

Schritt 1:.. Achten Sie darauf, die halten, Benutzer Credential

. Schritt 2: Sie falls erforderlich Benutzerrollen etc

Schritt 3 zu ändern: zum

Schritt 4 strombezogenen Flush alle Arten von Cache (Client oder Server): Umleitung des Benutzers zu einem temp-Ansicht, in der die von Ihnen gehaltene Benutzerberechtigung automatisch angewendet wird und dann zum Portal weitergeleitet.

Lemme wissen, ob es funktioniert

+0

Es tut mir leid, aber Ich arbeite nicht mehr an diesem Projekt :(. – dgcipp

+0

Oh! Ich verpasste das Datum der Veröffentlichung. –

-1

Wenn Sie die Methode aufrufen Sie vorbei screen

setProfile(companyId, screenname); 

Aber in ur setProfileMethod, Sie verwenden UserId

public static void setProfile(long companyId, long userId){ 
      User user = UserLocalServiceUtil.getUser(userId); 
      Role liferayRole = RoleLocalServiceUtil.fetchRole(companyId, "Administrator"); 
      RoleLocalServiceUtil.addUserRole(user.getUserId(), liferayRole.getRoleId()); 
      UserLocalServiceUtil.updateUser(user); 
    } 

Verwenden Sie Methode

UserLocalServiceUtil.fetchUserByScreenName(companyId, screenName) 
0

Ich denke, dass die Lösung von Clear Cache funktioniert, weil Sie alle zwischengespeicherten Portlets Repsones entfernen müssen. So macht mein_account es.

// Clear cached portlet responses 
PortletSession portletSession = actionRequest.getPortletSession(); 
InvokerPortletImpl.clearResponses(portletSession); 

Das Problem ist, dass InvokerPortletImpl nicht extern sichtbar ist. um dies funktional zu replizieren, können Sie versuchen, eine login.events.post und erhalten Sie die Antworten Cache von der HttpSession e löschen Sie die Karte;

httprequest.getSession().getAttribute("CACHE_PORTLET_RESPONSES").clear() 

aber es ist wie ein Hack ist es besser, in diesem Fall MultiVMPoolUtil.clear();

Verwandte Themen