我无法理解 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());
}
}
然后我将注释附加到getUser
带有@Security.Authenticated(Secured.class)
. 它工作正常并返回未经授权的错误。但现在我不确定这是否是首选方式。我觉得这不是正确的方法,因为函数覆盖的名称也getUsername
表明了这一点。我没有检查会话或 cookie 中的任何用户名,而只是检查请求标头中存在的令牌。
另外我知道有一个名为的模块Deadbolt
用于授权,但我阅读了它的文档并且我无法集成它。对于像我这样的初学者来说,这是相对复杂的集成。我对如何使用它感到困惑。我考虑过使用SubjectPresent
控制器授权,但我仍然无法成功实施。
最后你们建议我应该使用Security.Authenticator
我实施的方式吗?或者你是否建议我去我的第一个选项是检查getUser
方法内部的授权?或者任何人都可以告诉我如何Deadbolt
在我的场景中实现?