2015-12-21 19 views
5

Liferay kullanıcılarına uygulamada oturum açtıklarında rol atamaları gerekiyor.Liferay'de kullanıcı için role role ekle

Ben 'Şifrematik' uygulayan özel sınıf 'authenticateByScreenName' yöntemde tüm mantığı uyguladık.

örnek kod:

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

ben log-in, görünüşe göre ben liferay veritabanının tabloları kontrol, işler ve bunlar güncellenir, benim kullanıcı "Yönetici" rolü atanmış demektir. Ancak, ön uçtaki portal "Yönetici" seçeneğini göstermiyor.

enter image description here

Ama basına, 'Hesabım' için 'kaydet' butonuna giderseniz, Çıkış yapın ve log-in tekrar Yönetici seçenekleri availables.

Bunun neden olduğunu bilen var mı ?, Rolü atadıktan sonra 'updateUser()' çağrıyorum, 'Kaydet' düğmesiyle aynı değil mi?

Olası çözüm: Kümenin karşısında önbelleğe alınan içeriği temizlersek, iyi çalıştığını buldum. Ben "kaydederken liferay ne bulamıyor ?, bu doğru çözüm olup olmadığını

MultiVMPoolUtil.clear(); 

bilen var:

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

aşağıdaki satırı ekleyin: Ben bu yazı buldum "my_account" sayfasındaki tuşa basıldı. Belki bu önbelleği temizler? Veritabanı işleviyle bir senkronizasyon arıyordum ama hiçbir şey bulamadım. Bir sütun güncellenir eğer :(önbelleğe eğer, liferay kullanmak etmediğini gibi görünüyor

+0

Ön kimlik doğrulayıcısı mı yoksa kimlik doğrulayıcısı mı? Post-authenticator sonra kullanıcı bağlamında yönetici ayrıcalıkları ile güncellenir edemez inanıyorum. –

+0

Ön kimlik doğrulayıcısı: S. – dgcipp

+2

Bunun yerine, UserLocalServiceUtil.addRoleUser (uzun roleId, long userId) 'yi deneyin! –

cevap

0

Sana ucuz bir hack verebilir

Adım 1:.. Eğer kullanıcı ele olduğundan emin olun kimlik bilgisi

Adım 2:. Do

Adım 3 kullanıcı rolleri vb değiştirmek için gerekli: akışı ile ilgili önbellek her türlü (istemci veya sunucu) Flush

Adım 4: bir kullanıcıyı yönlendirme tuttuğunuz kullanıcı kimlik bilgilerinin otomatik olarak uygulanacağı temp görünümü ly ve sonra portala yönlendirildi.

Bırak o sen kullanıcıkimliği

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

Kullanım Yöntemi

+0

Üzgünüm ama Ben artık bu projede çalışmaz :( – dgcipp

+0

Oh! Gönderilen tarihi görmeyi özledim. –

-1

Eğer

setProfile(companyId, screenname); 

Ama ur setProfileMethod içinde ekranismi

geçiyoruz yöntemini çağırır

kullanıyor çalışıp çalışmadığını bilmek
UserLocalServiceUtil.fetchUserByScreenName(companyId, screenName) 
0

Önbelleğe alınmış tüm portletleri kaldırmanız gerektiğinden, temiz önbellek çözümünün çalıştığını düşünüyorum. Bu my_account'ın yaptığı yoldur.

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

Sorun, InvokerPortletImpl öğesinin dışarıdan görünmemesidir. Bu işlevi çoğaltmak için, login.events.post'u deneyebilir ve HttpSession e yanıtlarını önbelleğe alabilirsiniz;

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

ama bir bu durumda MultiVMPoolUtil.clear onun daha iyi kesmek gibidir();

İlgili konular