2011-06-29 13 views
13

Bir kullanıcı rolünün bir eylemi gerçekleştirmesini engellemek için.isUserInRole (rol) doğru olarak nasıl kullanılır?

  1. Örnek 1: Rol "yönetici" eylemi imha gerçekleştirmek için izin verilen tek rolüdür.
  2. Örnek 2: "Misafir" ten farklı olan herhangi bir rol CREATE eylemi gerçekleştirebilir.

    public String delete() { 
    if(FacesContext.getCurrentInstance().getExternalContext().isUserInRole("administrator"){ 
        //.....the action to perform 
    } 
    return "Denied"; 
    } 
    

    Ben henüz ben EJB ama ManagedBeans kullanmıyorum ek açıklama EJB @RolesAllowed() kullanmak isterdim: Gerçek bir durumda

, bende bu var. Yani soru şu: Bir çok rolleri aynı anda kullanmanın bir yolu var mı? Bazı geçici çözüm! Örnek: Bir eylemin 3 role izin vermesi gerekiyorsa (yönetici, yönetici, yönetici). Yapmak zorunda olduğum: Ve tüm yöntemleri yeniden üretmek bir acıdır.

public class AuthorizationUtils { 
    public static boolean isUserInRoles(String[] roles) { 
     for (String role : roles) { 
      if (FacesContext........isUserInRole(role)) { 
       return true; 
      } 
     } 

     return false; 
    } 
} 

Ve sonra onu çağırmak: yöntemlerden :(yüzlerce gibi bir şey

cevap

28

işleyen bir engelleyici yapabilirsiniz Bu, görünüm tarafında denetlenmelidir. bazı sitelerde, basmak için yeterli haklara sahip olmadığınız ve bu nedenle de korkutucu bir hata sayfası aldığınız bir düğme görürsünüz?

Düğmeyi yalnızca kullanıcı gerekli role sahip olduğunda görüntüleyebilmeli, yoksa tamamen gizleyiniz. MTU istek değerleri faz uygulamak sırasında bir kez daha koşul denetler olarak

<h:commandButton value="Delete" action="#{bean.delete}" 
    rendered="#{request.isUserInRole('administrator')}" /> 

Bu (CSRF) kesmek için duyarlı değildir.

Tek bir görünümde birden fazla koşulun kullanılması ve aynı tekrarlamanın tekrar edilmesi hakkında kısa bir takma ad vermek için <c:set> kullanmayı düşünün. Tüm ana şablonların üst kısmına yerleştirebilirsiniz, böylece tüm alt şablonlar kullanılabilir.

Mediterran81 @
<c:set var="isPowerUser" value="#{request.isUserInRole('manager') or request.isUserInRole('administrator')}" scope="request" /> 
... 
<h:commandButton rendered="#{isPowerUser}" /> 
... 
<h:commandButton rendered="#{isPowerUser}" /> 
+0

akıllı uygulama! çok sinir bozucu ti DENETEDİLDİĞİNİ mesajı aldım.YENİ yönetici ve benzeriyse ADMIN panelini görüntülemek için rendered özniteliğini zaten kullanıyorum.Görme yapmak, elbette bahsettiğiniz avantajlara sahiptir, fakat sorun devam etmektedir: her rol ayrı kullanım veya operatör! Ben yanlış mıyım? – Hanynowsky

+1

En az daha özlü '# {facesContext.externalContext.isUserInRole ('yönetici')}' :) Aynı durum birden fazla kez aynı tekrarlamak gerekirse görünüm, sonra da bir takma ad vermek için '' kullanabilirsiniz. Ayrıca güncellenmiş cevaba bakınız. – BalusC

+0

Teşekkürler BalusC! Yeni rolleri tanımlamak ve manged bean'daki eylem yöntemlerini kesmekten kaçınmak için ana şablonu ui: param ile kullanmak akıllıca olacaktır. Şimdi benim için iyi çalışıyor, Tek yapmam gereken, görünüşte ihtiyaç duyulan yeni rol takma adlarını uygulamak. @Bozho yöntemi, izin verilmeyen sayfayı gerçekten yetkilendirilmemiş kullanıcıya göstermek istiyorsa, benim için de iyi çalışıyor. – Hanynowsky

7

Bir yarar yöntemine mantığı taşıyarak bu kısaltabilirsiniz

if (AuthorizationUtils.isUserInRoles(new String[] {"administrator", "moderator"})) { 
    .. 
} 

Eğer CDI kullanıyorsanız, @RolesAllowed ek açıklama

+0

bu benim soruma cevaptır. @BalusC daha iyi bir uygulama yaparken. Bu nedenle, yardımcı yönteminizi eylem yöntemlerini kesmek yerine görünümde kullanabilir miyim? Bir şey gibi: '' Sanırım saçmalık diyorum! hayır? – Hanynowsky

+0

EL'nin bu statik başlatmaya izin verip vermeyeceğinden emin değilim, ancak bir yönetilen oluşturabilirsiniz. bean 'authBean' olarak adlandırılan ve o yöntemi koydu. – Bozho

+0

Utility yöntemi bir çekicilik gibi çalışır! Şu anda benim adapte olduğum gibi @BalusC cevabını kabul edersem, her zamanki gibi – Hanynowsky

1

: Yani temelde nasıl yönetilen fasulye başlatmasını vardır ... fasulye yöntemi bazlı yetkilendirme çözüm arıyorsanız? Sen basit bir XML formatı tanıtmak olabilir: -

<bean class=""> 
<method name=""> 
    <role> xyz</role> 
</method> 
</bean> 

yarar sınıfı tarafından okunur ve bu XML sonra yapmanız gereken tek şey yöntemi yürütmek için izin olup olmadığını belirlemek için Utility statik yöntemi çağırmak için olan var.

+0

OP, JSF kullanıyor. – BalusC

+0

Daha önce XML kullanmayı düşündüm ama sipariş etmemem gerekiyordu ve bir şeyleri başarmak için minimum kodlamayı kullanmam isteniyor. Bir JSF ortamında, JSF görünüm yeteneklerini kullanarak görünümde oynamayı istedim. Bununla birlikte, cevabım, yöntem rol yetkilendirmesine ulaşmanın temiz ve sorunsuz bir yolunu açıkladığımdan, cevabınıza oy verdim. Teşekkürler ag112 – Hanynowsky

İlgili konular