如何在 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认证方案。以下是指南。

  1. 登录 servlet:此 servlet 将验证用户名和密码。如果验证成功,servlet 将return 一个token 包含userId、roles、expires ...等。您可以使用JWT (Json Web Token) 格式。令牌将由服务器使用密钥 generated/validated。

  2. 登录场景- JavaFX:当登录按钮按下时,应用程序将向登录servlet发送登录请求。如果登录成功,应用程序将收到一个令牌并将令牌保存在秘密存储中以备后用。记忆中应该没问题。

  3. 对于后续的 HTTP 请求 (JavaFX):应用需要重新发送令牌(通过 header 等)。服务器将在调用实际资源之前验证令牌。如果验证成功,则认为请求已通过身份验证。您可以使用 JavaEE 过滤器来验证令牌。