如何在 JavaEE 中验证 JavaFX 客户端
How to authenticate JavaFX client in JavaEE
我在客户端用 JavaFX 开发三层应用程序,JavaEE/Glassfish 在服务器端,MySQL 作为数据库管理系统。我还使用 REST 和 JSON 通过网络传输数据。
现在我尝试使用 JavaEE 安全方式配置身份验证。我在企业 bean 中使用带有注释的声明方法,我已经配置了 Glassfish 文件领域(添加 user/group)和 glassfish-web.xml 描述符(添加组名和角色标签)。 JavaEE 教程说,如果完成所有需要的准备工作,那么当客户端尝试获取受保护的资源时,Glassfish 应该向客户端请求 login/password 对。如果它是一个网络客户端,我知道它是如何工作的,但在我的例子中,它是一个桌面 JavaFX 客户端,我不明白 Glassfish 如何在桌面应用程序中询问客户端。如何用JavaFX-Glassfish做认证机制?
更新
身份验证 window 如果我尝试从浏览器(Chrome、IE)调用 servlet 并且身份验证机制能够工作,则会弹出。但是当我打开 JavaFX window 时,我什么也没看到(白色场景)。
这里是class(JavaFX WebView)的代码,我用它打开登录失败window:
import javafx.application.Application;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
public class WebViewSample extends Application {
private Scene scene;
@Override
public void start(Stage stage) {
// create the scene
stage.setTitle("Web View");
scene = new Scene(new Browser(), 750, 500, Color.web("#666970"));
stage.setScene(scene);
scene.getStylesheets().add("webviewsample/BrowserToolbar.css");
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
class Browser extends Region {
final WebView browser = new WebView();
final WebEngine webEngine = browser.getEngine();
public Browser() {
getStyleClass().add("browser");
webEngine.load("http://localhost:8080/ForthDynamicWebProject/FirstServlet");
getChildren().add(browser);
}
}
您不应在此处使用标准 Java EE cookie 身份验证,因为您的客户端是桌面应用程序。
您可以使用Token认证方案。以下是指南。
登录 servlet:此 servlet 将验证用户名和密码。如果验证成功,servlet 将return 一个token 包含userId、roles、expires ...等。您可以使用JWT (Json Web Token) 格式。令牌将由服务器使用密钥 generated/validated。
登录场景- JavaFX:当登录按钮按下时,应用程序将向登录servlet发送登录请求。如果登录成功,应用程序将收到一个令牌并将令牌保存在秘密存储中以备后用。记忆中应该没问题。
对于后续的 HTTP 请求 (JavaFX):应用需要重新发送令牌(通过 header 等)。服务器将在调用实际资源之前验证令牌。如果验证成功,则认为请求已通过身份验证。您可以使用 JavaEE 过滤器来验证令牌。
我在客户端用 JavaFX 开发三层应用程序,JavaEE/Glassfish 在服务器端,MySQL 作为数据库管理系统。我还使用 REST 和 JSON 通过网络传输数据。
现在我尝试使用 JavaEE 安全方式配置身份验证。我在企业 bean 中使用带有注释的声明方法,我已经配置了 Glassfish 文件领域(添加 user/group)和 glassfish-web.xml 描述符(添加组名和角色标签)。 JavaEE 教程说,如果完成所有需要的准备工作,那么当客户端尝试获取受保护的资源时,Glassfish 应该向客户端请求 login/password 对。如果它是一个网络客户端,我知道它是如何工作的,但在我的例子中,它是一个桌面 JavaFX 客户端,我不明白 Glassfish 如何在桌面应用程序中询问客户端。如何用JavaFX-Glassfish做认证机制?
更新
身份验证 window 如果我尝试从浏览器(Chrome、IE)调用 servlet 并且身份验证机制能够工作,则会弹出。但是当我打开 JavaFX window 时,我什么也没看到(白色场景)。 这里是class(JavaFX WebView)的代码,我用它打开登录失败window:
import javafx.application.Application;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
public class WebViewSample extends Application {
private Scene scene;
@Override
public void start(Stage stage) {
// create the scene
stage.setTitle("Web View");
scene = new Scene(new Browser(), 750, 500, Color.web("#666970"));
stage.setScene(scene);
scene.getStylesheets().add("webviewsample/BrowserToolbar.css");
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
class Browser extends Region {
final WebView browser = new WebView();
final WebEngine webEngine = browser.getEngine();
public Browser() {
getStyleClass().add("browser");
webEngine.load("http://localhost:8080/ForthDynamicWebProject/FirstServlet");
getChildren().add(browser);
}
}
您不应在此处使用标准 Java EE cookie 身份验证,因为您的客户端是桌面应用程序。
您可以使用Token认证方案。以下是指南。
登录 servlet:此 servlet 将验证用户名和密码。如果验证成功,servlet 将return 一个token 包含userId、roles、expires ...等。您可以使用JWT (Json Web Token) 格式。令牌将由服务器使用密钥 generated/validated。
登录场景- JavaFX:当登录按钮按下时,应用程序将向登录servlet发送登录请求。如果登录成功,应用程序将收到一个令牌并将令牌保存在秘密存储中以备后用。记忆中应该没问题。
对于后续的 HTTP 请求 (JavaFX):应用需要重新发送令牌(通过 header 等)。服务器将在调用实际资源之前验证令牌。如果验证成功,则认为请求已通过身份验证。您可以使用 JavaEE 过滤器来验证令牌。