Play Framework 2.7 授权获取用户

Posted

技术标签:

【中文标题】Play Framework 2.7 授权获取用户【英文标题】:Play Framework 2.7 Authorization Get User 【发布时间】:2019-03-16 08:19:26 【问题描述】:

我正在尝试向我在 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 控制器中所做的那样。

编辑:我的问题归结为您在 Play 2.7 中将经过身份验证的用户存储在哪里,因为 Http.Context 已被弃用?

【问题讨论】:

【参考方案1】:

您可以使用动作组合

https://www.playframework.com/documentation/2.7.x/JavaActionsComposition#Passing-objects-from-action-to-controller

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 插件:

https://github.com/pac4j/play-pac4j

https://github.com/pac4j/play-pac4j-java-demo

【讨论】:

谢谢,动作组合正是我想要的。不幸的是,据我所知,pac4j 不支持 play 2.7。 是的,他们在实施新版本方面并没有那么快,但他们正在努力。

以上是关于Play Framework 2.7 授权获取用户的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework 1.2.7 表单出现神秘错误

包 io.ebean 不存在 Play Framework 2.7

Play Framework 1.2.7 添加选择标签到表单标签作为输入字段

是否可以在 Play Framework 2.7 中访问动作组合中的路由参数?

如何在 Play Framework v1.2.7 中配置带有动态 id 属性的 POST 路由,该属性将加载 JPA 实体

安装 Play Framework 1.2.7 时出现问题