2015-12-21 22 views
5

Devo assegnare ruoli ai miei utenti di Liferay quando accedono all'applicazione.Aggiungere ruolo all'utente in Liferay a livello di programmazione

ho implementato tutta la logica in metodo di una classe personalizzata che implementa 'Authenticator' il 'authenticateByScreenName'.

codice Esempio:

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); 
    } 
} 

Quando accedo-in, a quanto pare funziona, verifico le tabelle del database Liferay e sono aggiornati, il mio utente ha ruolo di "amministratore" assegnato. Tuttavia, il portale nel front-end non mostra l'opzione "Admin".

enter image description here

ma se vado a 'Il mio conto', premere il pulsante 'salva', log-out e log-in ancora una volta ho le opzioni disponibili Admin.

Qualcuno sa perché questo accade ?, Sto chiamando 'updateUser()' dopo aver assegnato il ruolo, non è lo stesso del pulsante 'salva'?

Soluzione possibile: Ho trovato che Se cancello il contenuto memorizzato nella cache attraverso il cluster funziona correttamente. L'ho trovato in questo post:

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

Aggiungere la seguente riga:

MultiVMPoolUtil.clear(); 

Qualcuno sa se è questa la soluzione giusta ?, non riesco a trovare quello che fa Liferay quando il "salva "viene premuto il pulsante dalla pagina" my_account ". Forse cancellare questa cache ?. Stavo cercando una sincronizzazione con la funzione di database ma non ho trovato nulla. Sembra essere che se una colonna viene aggiornata, Liferay non usarlo se è memorizzato nella cache :(

+0

È pre-autenticatore o post-autenticatore? Credo che se il suo post-autenticatore e il suo contesto utente non verranno aggiornati con i privilegi di amministratore. –

+0

È pre-autenticatore: S. – dgcipp

+2

Prova invece 'UserLocalServiceUtil.addRoleUser (long roleId, long userId)'! –

risposta

0

posso darvi un hack a buon mercato

Fase 1:.. Assicuratevi di avere il possesso di utente credenziale

Fase 2:. Fate come necessario cambiare ruoli utente ecc

Fase 3: Sciacquare tutti i tipi di cache (client o server) relativi al flusso

Fase 4: reindirizzare l'utente a un temp view dove le credenziali dell'utente che hai tenuto saranno applicate automaticamente ly e poi reindirizzato al portale.

Fammi sapere se funziona

+0

Mi dispiace ma Non lavoro più su questo progetto :(. – dgcipp

+0

Oh! Mi mancava vedere la data pubblicata. –

-1

Quando si chiama il metodo si sta passando screenname

setProfile(companyId, screenname); 

Ma in ur setProfileMethod, si utilizza 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); 
    } 

Metodo di uso

UserLocalServiceUtil.fetchUserByScreenName(companyId, screenName) 
0

Penso che la soluzione della cache chiara funzioni perché è necessario rimuovere tutti i repsones dei portlet memorizzati nella cache. Questo è il modo in cui my_account lo fa.

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

Il problema è che InvokerPortletImpl non è visibile esternamente. per replicare questo funzionalmente puoi provare un login.events.post e ottenere la cache delle risposte dalla HttpSession e svuotare la mappa;

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

ma è come un hack è migliore in questo caso MultiVMPoolUtil.clear();