摘要:Apache Guacamole 是一个开源的远程桌面网关,允许用户通过 Web 浏览器访问远程计算机桌面环境。本文将介绍如何进行 Guacamole 的二次开发和定制,以满足特定需求和业务场景。

导言

Apache Guacamole 是一个功能强大的远程桌面网关,通过 Web 浏览器,用户可以轻松地访问远程计算机的桌面环境,而无需安装任何客户端软件。然而,在某些情况下,用户可能需要定制 Guacamole 来满足特定的需求,例如集成特定的身份验证方式、添加自定义的功能或改进用户界面。在本文中,我们将探讨如何进行 Guacamole 的二次开发和定制,以便将其适应于各种不同的场景。

1. 理解 Guacamole 的架构

在开始二次开发之前,首先需要对 Guacamole 的架构有一定的了解。Guacamole 主要由两个部分组成:

  • Guacamole Client:客户端部分,是一个基于 HTML5 的 Web 应用程序,提供了用户界面,用户通过它与远程桌面进行交互。
  • Guacamole Server:服务器端部分,负责管理远程桌面连接和会话,以及将远程桌面数据传输到客户端。

理解 Guacamole 的架构对于定制和二次开发非常重要,因为不同的定制需求可能涉及到客户端、服务器端或两者的改动。

978eddf1ef8c4f61bc462f05e0fddb2b.png

2604a09db66e4b09bf44d3dae74e930d.png

2. 二次开发 Guacamole 客户端

2.1 定制用户界面

Guacamole 客户端的用户界面是通过 HTML、CSS 和 JavaScript 实现的。你可以根据自己的需求修改现有的界面布局、样式或行为,或者添加新的功能模块。

开发文档:

参考https://guacamole.apache.org/doc/gug/installing-guacamole.html#guacamole-client 安装环境.

环境需要:

  1. Apache Maven

    1. Apache Maven 3.9.7 (8b094c9513efc1b9ce2d952b3b9c8eaedaf8cbf0)
      Maven home: /usr/local/apache-maven-3.9.7
      Java version: 16.0.2, vendor: Oracle Corporation, runtime: /usr/local/jdk-16.0.2
      Default locale: zh_CN, platform encoding: UTF-8
      OS name: "linux", version: "5.15.0-76-generic", arch: "amd64", family: "unix"
  2. Java JDK

    1. openjdk version "16.0.2" 2021-07-20
      OpenJDK Runtime Environment (build 16.0.2+7-67)
      OpenJDK 64-Bit Server VM (build 16.0.2+7-67, mixed mode, sharing)
  3. Tomcat

    1. https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.89/bin/apache-tomcat-9.0.89.tar.gz

2.2

2.2 设置新增页面

在 Guacamole 中新增设置页面可以极大地提升用户体验和管理效率。以下步骤将指导你如何在现有系统中添加新的页面。

步骤一:找到相关文件

首先,定位到 guacamole/src/main/frontend/src/app/navigation/services/userPageService.js 文件。此文件主要用于生成用户可以访问的页面。

步骤二:修改 generateSettingsPages 方法

在文件中找到 generateSettingsPages 方法。该方法的作用是根据用户的权限生成设置页面,包括用户管理、用户组管理、连接管理、查看连接记录等页面。特殊的页面,如会话管理和用户偏好设置页面,总是可访问的。

步骤三:添加新页面

根据需要,添加普通页面或权限限定页面。以下是具体示例:

添加一个普通页面

      // Add link to Session management (always accessible)
      pages.push(new PageDefinition({
        name: 'USER_MENU.ACTION_MANAGE_SESSIONS',
        url: '/settings/sessions'
      }))

添加一个仅管理员可访问的页面

if (PermissionSet.hasSystemPermission(permissions, PermissionSet.SystemPermissionType.ADMINISTER)) {
          pages.push(new PageDefinition({
            name: 'USER_MENU.ACTION_MANAGE_USER_GROUPS',
            url: '/settings/userGroups'
          }))
        }

通过这种方式,你可以灵活地根据用户权限添加不同的设置页面。

步骤四:在 settings.html 中添加新页面

由于 Guacamole 的设计,新添加的页面还需要在 guacamole/src/main/frontend/src/app/settings/templates/settings.html 文件中进行配置。原文件内容如下:

<div class="settings-view view">
  <div class="header tabbed">
    <h2>{{'SETTINGS.SECTION_HEADER_SETTINGS' | translate}}</h2>
    <guac-user-menu></guac-user-menu>
  </div>

  <!-- Available tabs -->
  <div class="page-tabs">
    <guac-page-list pages="settingsPages"></guac-page-list>
  </div>

  <!-- Selected tab -->
  <guac-settings-users ng-if="activeTab === 'users'"></guac-settings-users>
  <guac-settings-user-groups ng-if="activeTab === 'userGroups'"></guac-settings-user-groups>
  <guac-settings-connections ng-if="activeTab === 'connections'"></guac-settings-connections>
  <guac-settings-connection-history ng-if="activeTab === 'history'"></guac-settings-connection-history>
  <guac-settings-sessions ng-if="activeTab === 'sessions'"></guac-settings-sessions>
  <guac-settings-preferences ng-if="activeTab === 'preferences'"></guac-settings-preferences>
</div>

要添加新页面,需要在此文件中添加相应的 ng-if 条件语句。例如:

<guac-settings-custom-page ng-if="activeTab === 'customPage'"></guac-settings-custom-page>

确保 activeTaburl 中的路径对应,这样可以正确显示新添加的页面。

步骤五:实现具体页面

当添加完路由后,还需要实现具体的页面。具体页面的实现可以按照以下步骤进行:

  1. 创建页面模板:在 guacamole/src/main/frontend/src/app/settings/templates 目录下创建新的 HTML 文件,定义页面的基本结构和内容。
  2. 编写页面逻辑:在guacamole/src/main/frontend/src/app/settings/directives 目录下创建新的Javascript文件,编写页面的交互逻辑,包括数据的获取和展示。
  3. 样式调整:在guacamole/src/main/frontend/src/app/settings/styles目录下创建新的Css文件,并在该CSS 文件中定义页面的样式,确保页面美观且用户体验良好。

以下是一个简单的页面实现示例:

<!-- 新建的 HTML 页面模板 -->
<div class="custom-page">
  <h1>管理用户组</h1>
  <div class="user-groups">
    <!-- 这里可以添加具体的用户组管理功能 -->
  </div>
</div>
/**
 * Angular directive
 */
angular.module('settings').directive('guacCustomPage', ['$window', function guacSettingsFileUpload() {

  return {
    // Element only
    restrict: 'E',
    replace: true,

    scope: {
    },

    templateUrl: 'app/settings/templates/fileUpload.html',
    controller: ['$scope', '$injector', '$timeout', '$window', function settingsConnectionHistoryController($scope) {
      $scope.userGroups = []

      // 获取用户组数据
      // ...具体逻辑实现代码
    }],

  }

}])
步骤六:测试和部署

完成页面实现后,进行充分的测试,确保页面功能正常,用户体验良好。测试通过后,将修改后的代码部署到生产环境中。

通过以上步骤,你可以成功地在 Guacamole 设置中新增页面,从而更好地满足特定的业务需求和用户管理需求。

2.2 集成自定义认证

Guacamole 默认提供了一些认证方式,如基于用户名密码的认证、LDAP 认证等。如果你需要集成其他认证方式,比如 OAuth、SAML 等,你可以编写自定义的认证插件,并将其集成到 Guacamole 客户端中。

3. 扩展 Guacamole 服务器端

3.1 开发自定义认证插件

如果你需要实现与现有认证系统的集成或者开发全新的认证方式,你可以开发自定义认证插件,并将其部署到 Guacamole 服务器端。

3.2 实现自定义协议支持

Guacamole 支持多种远程桌面协议,如 VNC、RDP、SSH 等。如果你需要支持其他协议,你可以开发相应的插件,并将其集成到 Guacamole 服务器端。

4. 使用 Guacamole API 进行集成

Guacamole 提供了一组 API,允许开发人员与 Guacamole 进行集成。你可以使用这些 API 来构建自定义的应用程序、脚本或插件,与 Guacamole 进行交互。

结语

Apache Guacamole 提供了丰富的功能和灵活的架构,使其成为远程桌面访问的理想选择。通过二次开发和定制,你可以将 Guacamole 定制为适应各种不同的业务场景和需求。在进行二次开发之前,确保充分理解 Guacamole 的架构和API,并根据具体的需求选择合适的定制方式。

最后修改:2024 年 06 月 24 日
如果觉得我的文章对你有用,请随意赞赏