gpt4 book ai didi

java - Play 框架 2.7.* Java - 已弃用 HTTP 上下文 - 基于 token 的身份验证

转载 作者:行者123 更新时间:2023-12-02 01:53:44 24 4
gpt4 key购买 nike

目前正在将 play 框架升级到 2.7.* 由于 HTTP.Context 类的安全 validator 类已弃用,我收到错误响应

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


@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<java.lang.String>

最佳答案

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

您使用请求参数覆盖方法,因此您应该返回可选而不是字符串。

查看身份 validator 代码:


/**
* 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");
}

...

}

关于java - Play 框架 2.7.* Java - 已弃用 HTTP 上下文 - 基于 token 的身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57410988/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com