gpt4 book ai didi

Java httpServer 不同请求方式的基本认证

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:29 25 4
gpt4 key购买 nike

我在 Java 中使用一个非常简单的 httpServer 作为 api rest,包括 GET、POST、PUT 和 DELETE。我正在使用基本身份验证,我有几个类 Authentication.java 和 Authorisation.java,我用它们来验证和检查用户的权限。

所以,问题是我希望所有用户(经过身份验证)能够从我的 api rest 获取信息,但只有具有特定权限的用户才能 POST、PUT 和 DELETE。那我该怎么做呢?

这是我得到的

public class Server {

private static HttpServer server;

public static void start() throws IOException {

server = HttpServer.create(new InetSocketAddress(8000), 0);
HttpContext ctx = server.createContext("/users", new UserHandler());
ctx.setAuthenticator(new ApiRestBasicAuthentication("users"));

server.start();
}

}

这是我的 ApiRestBasicAuthentication

public class ApiRestBasicAuthentication extends BasicAuthenticator {

private UserAuthentication authentication = new UserAuthentication();

public ApiRestBasicAuthentication(String realm) {
super(realm);
}

@Override
public boolean checkCredentials(String user, String pwd) {
int authCode = authentication.authenticate(user, pwd);
return authCode == UserAuthentication.USER_AUTHENTICATED;
}

}

现在,检查凭据仅检查用户是否已通过身份验证。但我想检查一下,如果方法是 POST、DELETE 或 PUT,我还应该检查具体的凭据。但是如何在我的 ApiRestBasicAuthentication 中获取该方法?我正在我的处理程序类中这样做

public void handle(HttpExchange httpExchange) throws IOException {
String method = httpExchange.getRequestMethod();
if ("post".equalsIgnoreCase(method)) {
createUser(httpExchange);
} else if ("get".equalsIgnoreCase(method)) {
readUsers(httpExchange);
} else if ("put".equalsIgnoreCase(method)) {
updateUser(httpExchange);
} else if ("delete".equalsIgnoreCase(method)) {
deleteUser(httpExchange);
}
}

也许这应该以其他方式完成。有什么想法吗?

非常感谢。

最佳答案

一个简单的方法是改变你的ApiRestBasicAuthentication 像:

public class ApiRestBasicAuthentication extends BasicAuthenticator {

private UserAuthentication authentication = new UserAuthentication();

public ApiRestBasicAuthentication(String realm) {
super(realm);
}

@Override
public Authenticator.Result authenticate(HttpExchange exch) {
Authenticator.Result result=super.authenticate(exch);
if(result instanceof Authenticator.Success) {
HttpPrincipal principal=((Authenticator.Success)result).getPrincipal();
String requestMethod=exch.getRequestMethod();
if( ADD SOME LOGIC HERE FOR PRINCIPAL AND REQUEST METHOD) {
return new return new Authenticator.Failure(401);
}
return result;

}
}

@Override
public boolean checkCredentials(String user, String pwd) {
int authCode = authentication.authenticate(user, pwd);
return authCode == UserAuthentication.USER_AUTHENTICATED;
}

}

并为您希望 validator 失败的请求/用户添加一些逻辑。我在这里向您展示了如何在 authenticate 方法中获取该方法,但您需要指定凭据的类型。


另一种解决方案是,如果您检查 BasicAuthenticator 的源代码,您可以看到它如何实现 authenticate 方法,并且您可以以类似的方式创建自己的实现,而不是扩展 BasicAuthenticator 并使用 get 方法而不仅仅是用户名和密码。可以看源码here我相信您一定能找到自己的出路 ;)

通常在企业应用程序中,您可以使用一些外部安全管理系统 - 例如,如果您使用 Spring(当前 java web 应用程序中的事实标准),您可以使用 spring security 并以更具声明性的方式执行此类安全模式和过滤器方式

关于Java httpServer 不同请求方式的基本认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41407510/

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