2011-08-29 100 views
1

我使用playframework的安全module.I有兩個用戶 - 酮管理員嘗試驗證,其他與正常previleges.They被定義爲讓只有管理員用戶輸入playframework管理CRUD區域

User(adminuser): 
    email: [email protected] 
    password: secret 
    isAdmin: true 
User(normaluser): 
    email: [email protected] 
    password: normalpass 

我希望只有管理員用戶能夠登錄到管理區域並使用crud界面創建實體。我應該如何解決這個問題?

*  /admin   module:crud 

帶來了一個登錄屏幕,該屏幕adfter登錄從上面兩個用戶,帶他們到管理area.How我可以限制進入管理區只有管理員用戶,並告知用戶正常的是他不沒有足夠的權限訪問管理區域?

回答

2

使用CRUD,您可以爲每個實體聲明一個控制器。然後,您可以添加安全性所需的註釋。

例如,對於用戶的實體,您將有此控制器:

@Check("admin") 
@With(Security.class) 
@For(models.User.class) 
public class Users extends controllers.CRUD { 
} 

在@With你點得延長Secure.Security類。例如:

public class Security extends Secure.Security { 

    static boolean authenticate(String username, String password) { 
     return User.connect(email, password) != null; 
    } 

    static boolean check(String profile) { 
     if("admin".equals(profile)) { 
      return User.all().filter("email", connected()).get().isAdmin; 
     } 
     return false; 
    } 

    static void onDisconnected() { 
     Application.index(); 
    } 

    static void onAuthenticated() { 
     Admin.index(); 
    } 
} 
+0

在這種情況下,沒有必要使用onDisconnected和onAuthenticated方法,因爲Play會自動重定向到登錄頁面和「問」頁面;) –

2

我還不熟悉CRUD模塊,但在您的控制器中,您可以使用註釋@Check(「admin」)。 這將確保在每次調用帶註釋的方法之前,安全模塊將在您自己的安全實現類中調用靜態布爾檢查(字符串)方法。在那裏你可以簡單地檢查當前用戶是否是管理員並允許訪問。見下面的例子。

public class MySecurity extends Secure.Security 
{ 

.... other methods you should/could override .... 

static boolean check(String profile) 
{ 
    boolean result = false; 
    if("admin".equalsIgnoreCase(profile)) 
    { 
     User currentUser = User.find("byUsername", Security.connected()).first(); 
     result = currentUser.isAdmin; 
    } 

    return result; 

} 

希望這會有所幫助。 /Richard

+1

要獲得更多性能,請不要使用ignoreCase進行檢查,並立即返回結果而不是創建中間布爾值。 –

+0

我嚴重懷疑中介變量影響性能。我寧願擔心它如何讀取,而不是希望由JIT照顧的東西。即使JIT沒有,這也不是在執行數千次的循環中。 – varikin