2011-05-24 52 views
4

我使用wicket 1.4.9並實現了spring + wicket驗證角色並使用基於頁面角色的@AuthorizeInstantiation。我有多個自定義角色。使用wicket驗證wicket組件auth-role

我按照這個鏈接來實現的基本知識: https://cwiki.apache.org/WICKET/spring-security-and-wicket-auth-roles.html

之後,我已經實現了我自己的UserDetailsS​​ervice有我自己的角色/用戶數據庫。

現在,我該如何強制控制組件的角色,例如鏈接,按鈕?像 鏈接A只能被SUPER_USER,DR_MANAGER訪問。 (角色來自數據庫)。

我已經這樣做,它似乎工作,但是這樣做的好方法? OrbitWebSession是AuthenticatedWebSession類型。

 @Override 
     public boolean isVisible() { 
      if(OrbitWebSession.get().getRoles().hasRole("SUPER_USER")){ 
       return true; 
      } 
      return false; 
     } 

謝謝。

+1

您提到角色基於數據庫查詢。請注意在isVisible()中執行昂貴的調用。這是一個簡單的計算,但要確保一切都正確緩存。 – jbrookover 2011-05-24 19:16:32

+0

好吧,請澄清我的困惑,如果我的自定義AunthenticatedWebSession overries getRoles()方法,並且如果此方法從SecurityContextHolder獲取角色從我的UserDetails加載角色,是不是緩存?或者它在每次調用時從我的用戶實體獲取所有角色? – Shahriar 2011-05-25 19:02:02

+0

我不熟悉春天;我只是想確保您的用戶對象被緩存 - 每次運行此方法時運行數據庫查詢都會很糟糕。 – jbrookover 2011-05-25 19:25:32

回答

7

覆蓋是可見的所有的時間是一個主要的痛苦。反過來看看MetaDataRoleAuthorizationStrategy。您撥打authorize(Component component, Action action, String roles)Action RENDER,以及您想要允許的角色。通過這種方式,只要授權策略在您的Web應用程序中註冊,組件就會自動隱藏其他角色。基本上它和Holms的答案完全相同,除非你不需要任何子類。

+0

感謝馬丁很多:),我用它。 – Shahriar 2011-06-16 10:26:01

3

你是在正確的軌道,我會做的唯一的變化是:

@Override 
public boolean isVisible() { 
    return super.isVisible() && OrbitWebSession.get().getRoles().hasRole("SUPER_USER"); 
} 

這樣,你不小心覆蓋例如其默認可見的行爲,如果父組件是不可見的。

+0

這不是我在Wicket中的做法,其他答案使用標準Wicket授權實現,因此更好地查看它們。 – 2014-05-08 10:17:50

2

使用@AuthorizeAction註釋,您可以根據角色控制組件是否呈現。這很容易使用,但你必須繼承你想授權的組件。

@AuthorizeAction(action = Action.RENDER, roles = { "SUPER_USER", "DR_MANAGER" }) 
class UserAdminPageLink extends BookmarkablePageLink<String> { 
    //Implementation… 
} 
add(new UserAdminPageLink("UserAdminPageLink", UserAdminPage.class)); 

檢查出Wicket Examples - Authorization的一些工作代碼。

+0

謝謝,我會看看它。但我的應用程序有很多組件需要這種控制。我擔心我必須製造太多的子類! – Shahriar 2011-05-25 19:17:03