【问题标题】:Play framework 2.7.* Java - HTTP Context Deprecated - Token Based AuthenticationPlay framework 2.7.* Java - HTTP Context Deprecated - 基于令牌的身份验证
【发布时间】:2019-08-08 10:57:02
【问题描述】:

目前正在将播放框架升级到 2.7。* 由于 HTTP.Context 类的安全身份验证器类中的弃用,我收到错误响应

应用程序在 Play 2.6.* 上,并且身份验证按设计工作。如果我回滚到 2.6.*,则身份验证运行良好。本质上,我希望将身份验证令牌作为字符串返回。


    @Override
    public String getUsername(Http.Request ctx) {

        Optional token = getTokenFromHeader(ctx);
        if(token.isPresent()){
            UserAccount userAccount = UserAccount.find.query().where().eq("authtoken",token.toString()).findOne();

            if (userAccount != null){
                //ctx.args.put("userAccount", userAccount);
                //String resp = Optional.<String>ofNullable(null).orElse(orelesMethod());
                String resp = Optional.<String>ofNullable(null).orElse(userAccount.authtoken);
                return resp;
            }
        }
        return null;
    }

    @Override
    public Result onUnauthorized(Http.Request ctx) {
        Logger.info("onUnauthorized");
        ObjectNode result = Json.newObject();
        result.put("error","Unauthorized, Please login");
        return status(401,result);
    }

    private Optional getTokenFromHeader(Http.Request ctx) {
        return ctx.header("X-AUTH-TOKEN");
    }

}

原代码如下

public class Secured extends Security.Authenticator{

    @Override
    public String getUsername(Http.Context ctx) {
        String token = getTokenFromHeader(ctx);
        if(token != null){
            UserAccount userAccount = UserAccount.find.query().where().eq("authtoken",token).findOne();
            if (userAccount != null){
                ctx.args.put("userAccount", userAccount);
                return userAccount.authtoken;
            }
        }
        return null;
    }

    @Override
    public Result onUnauthorized(Http.Context ctx) {
        Logger.info("onUnauthorized");
        ObjectNode result = Json.newObject();
        result.put("error","Unauthorized, Please login");
        return status(401,result);
    }

    private String getTokenFromHeader(Http.Context ctx) {
        String[] authTokenHeaderValues = ctx.request().headers().get("X-AUTH-TOKEN");
        if ((authTokenHeaderValues != null) && (authTokenHeaderValues.length == 1) && (authTokenHeaderValues[0] != null)) {
            return authTokenHeaderValues[0];
        }
        return null;
    }

}

错误响应 return type java.lang.String is not compatible with java.util.Optional&lt;java.lang.String&gt;

【问题讨论】:

  • 您确定您发布的代码就是您遇到错误的代码吗?

标签: java playframework http-headers


【解决方案1】:

Play 2.7 对 Security.Authenticator 类进行了一些更改。现在它有两个名为 getUsername 的方法。

你用 Request 参数覆盖方法,所以你应该返回 Optional 而不是 String。

看看 Authenticator 代码:


    /**
     * Handles authentication.
     */

    public static class Authenticator extends Results {

        @Deprecated
        public String getUsername(Context ctx) {
            return ctx.session().get("username");
        }

        // You override this method
        public Optional<String> getUsername(Request req) {
            return req.session().getOptional("username");
        }

        ...

    }

【讨论】:

    猜你喜欢
    • 2017-11-16
    • 2021-01-25
    • 2016-01-23
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2014-12-17
    相关资源
    最近更新 更多