2011-08-29 161 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