我正在尝试向Play 2.7中内置的Rest API添加授权。我找到了一个较早播放版本here的好例子,但是我没有访问Http上下文的权限,因此无法将用户添加为arg。
在Play 2.7中还有另一种方法可以this来访问上下文吗?
public class Secured extends Security.Authenticator {
@Override
public String getUsername(Context ctx) {
String[] authTokenHeaderValues = ctx.request().headers().get(SecurityController.AUTH_TOKEN_HEADER);
if ((authTokenHeaderValues != null) && (authTokenHeaderValues.length == 1) && (authTokenHeaderValues[0] != null)) {
User user = models.User.findByAuthToken(authTokenHeaderValues[0]);
if (user != null) {
ctx.args.put("user", user);
return user.getEmailAddress();
}
}
return null;
}
@Override
public Result onUnauthorized(Context ctx) {
return unauthorized();
}
}
我希望能够像在Todo Controller中一样从其他控制器中吸引用户。
编辑:我的问题归结为您在Play 2.7中将经过身份验证的用户存储在哪里,因为不推荐使用Http.Context?
答案 0 :(得分:0)
您可以使用动作组合
public class Attrs {
public static final TypedKey<User> USER = TypedKey.<User>create("user");
}
public class PassArgAction extends play.mvc.Action.Simple {
public CompletionStage<Result> call(Http.Request req) {
return delegate.call(req.addAttr(Attrs.USER, User.findById(1234)));
}
}
在控制器中:
@With(PassArgAction.class)
public static Result passArgIndex(Http.Request request) {
User user = request.attrs().get(Attrs.USER);
return ok(Json.toJson(user));
}
我也建议您查看 pac4j 。它具有用于playframework的插件: