使用授权在Play Framework中限制对方法的访问
我无法在PlayFramework(版本2.5)中掌握授权的概念。 我的情况是我有一个REST API方法getUser
,我想通过使用名为"X-Authorization"
自定义请求标头中的令牌执行授权来限制其访问。 现在我的控制器代码如下所示:
package controllers;
import models.User;
import org.bson.types.ObjectId;
import play.mvc.*;
import org.json.simple.*;
import views.html.*;
public class ApiController extends Controller {
public Result getUser(String userId) {
User user = User.findById(new ObjectId(userId));
JSONObject userG = new JSONObject();
//Some code to append data to userG before return
return ok(userG.toJSONString());
}
}
路由URL是这样定义的:
GET /api/user/:id controllers.ApiController.getUser(id)
选项1可以检查方法getUser
的授权令牌,并检查其他凭证,但是我想在访问getUser
方法之前限制访问权限。 就像将来我会为这个REST API添加更多的方法调用。 因此,我将重复使用与未来REST API相同的授权。
我发现Play Framework中存在授权,我无法理解。 我尝试通过扩展类Security.Authenticator
并覆盖方法getUserName
和onUnauthorized
来实现授权,如下所示:
package controllers;
import models.Site;
import models.User;
import org.json.simple.JSONObject;
import play.mvc.Http.Context;
import play.mvc.Result;
import play.mvc.Security;
public class Secured extends Security.Authenticator {
@Override
public String getUsername(Context ctx) {
String auth_key = ctx.request().getHeader("X-Authorization");
Site site = Site.fineByAccessKey(auth_key);
if (site != null && auth_key.equals(site.access_key)) {
return auth_key;
} else {
return null;
}
}
@Override
public Result onUnauthorized(Context ctx) {
JSONObject errorAuth = new JSONObject();
errorAuth.put("status", "error");
errorAuth.put("msg", "You are not authorized to access the API");
return unauthorized(errorAuth.toJSONString());
}
}
然后我用@Security.Authenticated(Secured.class)
将注解附加到getUser
方法。 它工作正常并返回未经授权的错误。 但现在我不确定这是否是首选方式。 我觉得这不是正确的做法,因为getUsername
函数的重写名称也是这样。 我没有在会话或cookie中检查任何用户名,而只检查请求头中的令牌。
另外我知道有一个名为Deadbolt
的模块用于授权,但我阅读了它的文档,但我无法将其整合。 对于像我这样的初学者来说,这是相对复杂的整合。 我对如何使用它感到困惑。 我想过使用SubjectPresent
控制器授权,但仍然无法成功实施。
最后,你们是否应该按照我的实施方式使用Security.Authenticator
? 或者你建议我去我的第一个选项是检查getUser
方法内的授权? 或者任何人都可以告诉我如何在我的场景中实现Deadbolt
?
您正在混合授权和身份验证。
这是一个好主意:身份验证与授权
我喜欢这个答案:
身份验证 =登录名+密码(你是谁)
授权 =权限(您可以执行的操作)
身份验证 == 授权 (不包括匿名用户),如果您允许为您认识的所有用户(即经过身份验证的用户)
Deadbolt的主要目标是授权 (已认证的用户)。 您的主要目标是认证 。
我建议你使用Pac4J,它的认证库不仅适用于Play,它的版本也适用于Java和Scala。 有一个很好的示例项目:https://github.com/pac4j/play-pac4j-java-demo
我自己在我的项目和任务中使用这个库
就像将来我会为这个REST API添加更多的方法调用一样。 所以我会重复使用相同的授权给那些未来的REST API。
我解决起来很简单,只需在'application.conf`中添加配置:
pac4j.security {
rules = [
{"/admin/.*" = {
authorizers = "ADMIN"
clients = "FormClient"
}}
]
}
只是不要忘记添加安全过滤器。 该功能出现在示例项目中,因此只需克隆并尝试。
另一个例子形成官方网页:
pac4j.security.rules = [
# Admin pages need a special authorizer and do not support login via Twitter.
{"/admin/.*" = {
authorizers = "admin"
clients = "FormClient"
}}
# Rules for the REST services. These don't specify a client and will return 401
# when not authenticated.
{"/restservices/.*" = {
authorizers = "_authenticated_"
}}
# The login page needs to be publicly accessible.
{"/login.html" = {
authorizers = "_anonymous_"
}}
# 'Catch all' rule to make sure the whole application stays secure.
{".*" = {
authorizers = "_authenticated_"
clients = "FormClient,TwitterClient"
}}
]
链接地址: http://www.djcxy.com/p/22233.html
上一篇: Restricting Access to method in Play Framework with Authorization