我正在使用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());
}
正如您所看到的那样,它只是身份验证而非授权,例如它会检查用户是否已登录,但从不检查这是否是管理员的电子邮件
我的问题是:我应该如何为这些类添加访问权限,或者如何为此身份验证添加授权
请向我提供一个描述性答案,说明我应该对此类,控制器甚至项目的其他部分(可能是模型)进行哪些修改以获得适当的授权
请不要提供指向网站或网络日志的链接,除非他们专注于一个非常类似的问题
答案 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);
}
}