Play Framework句柄授权不认证

时间:2014-03-12 08:01:05

标签: authentication playframework authorization playframework-2.2

我正在使用Play Framework 2.2和Java开发应用程序 我已经实现了认证模块,就像下面的教程一样 http://www.playframework.com/documentation/2.1.0/JavaGuide4

简而言之,实施了一个安全的类

    public class Secured extends Security.Authenticator{

            @Override
            public String getUsername(Context ctx) {
               return ctx.session().get("email");
           }

           @Override
            public Result onUnauthorized(Context ctx) {
               return redirect(routes.Users.login());
           }
     }

然后在控制器中我将这一行添加到控制器的方法

     @Security.Authenticated(Secured.class)
     public static Result methodOfController(){

          //some codes here

    return ok( someView.render());
}

正如您所看到的那样,它只是身份验证而非授权,例如它会检查用户是否已登录,但从不检查这是否是管理员的电子邮件

我的问题是:我应该如何为这些类添加访问权限,或者如何为此身份验证添加授权

请向我提供一个描述性答案,说明我应该对此类,控制器甚至项目的其他部分(可能是模型)进行哪些修改以获得适当的授权

请不要提供指向网站或网络日志的链接,除非他们专注于一个非常类似的问题

2 个答案:

答案 0 :(得分:3)

您可以查看类似Deadbolt的解决方案,为此提供解决方案,或者您可以自行推广。 Java中的主要思想是使用Action composition来创建自定义操作注释。因此,您可以检查用户是否经过身份验证,然后检查用户是否获得了所请求资源的授权。

答案 1 :(得分:3)

我为我们的项目编写了一个简单的授权操作组合。

在您的操作或控制器之前,您可以添加如下所示的行:

@Auth({"GeneralManager","Manager"})

对于上面的行,只有具有“GeneralManager”或“Manager”角色的人才能访问操作或控制器。 “AuthAction”的实现可以是这样的:

public class AuthAction extends Action<Auth> {

public F.Promise<SimpleResult> call(Http.Context context) throws Throwable
{
    String[] params = configuration.value();
    int c = params.length;

    boolean found = false;
    if(params.length == 0) {
        found = true;
    }

   // Loop the given parameters(role names) to check that the user belongs to one of them
    for (String code: params) {
        // validate types
        int roleCount = Role.find.where().eq("code",code).findRowCount();
        if(roleCount == 0) {
            throw new Exception("Auth code is not found.");
        }

        if(user.role.code.equals(code)) {
            found = true;
        }
    }

    // if the role is not found for the user, it means the user is not authorised
    if(!found) {
        // no access, redirect to home
        return F.Promise.pure(redirect("/"));
    }

    // execute the action
    return delegate.call(context);
}
}