Bảo mật cấp hàng của BigQuery với Dịch vụ nâng cao

Ví dụ: giả sử bạn đang cố gắng tạo ra một giải pháp cho tổ chức bán hàng của mình. Tổ chức bán hàng được chia thành nhiều khu vực, trong đó mỗi khu vực có một Người quản lý theo khu vực riêng. Tập dữ liệu bán hàng trong BigQuery có doanh số bán hàng theo khu vực và theo ngày.

Giải pháp được đề xuất sẽ có một trang tổng quan duy nhất để Người quản lý theo khu vực chỉ có thể xem dữ liệu bán hàng của khu vực của họ.

Yêu cầu

  • Người xem trang tổng quan sẽ đăng nhập bằng Tài khoản Google.
  • Sẽ có một mối liên kết giữa email của người dùng và dữ liệu/hàng mà họ có quyền truy cập.
  • Tài khoản dịch vụ sẽ được dùng để truy cập vào dữ liệu BigQuery. Do đó, việc thanh toán sẽ được nhà cung cấp trang tổng quan tập trung và quản lý.

Các điểm hạn chế

  • Trang tổng quan yêu cầu mỗi người xem cấp quyền một lần trong lần xem đầu tiên.
  • Người xem không thể chỉnh sửa trang tổng quan hoặc chia sẻ với người khác.
  • Nếu bạn là khách hàng Workspace và quản trị viên của bạn đã tắt tính năng chia sẻ tệp trên Drive cho "Bất kỳ ai có đường liên kết", hãy xoá giới hạn chia sẻ hoặc phát triển giải pháp này trên tài khoản Gmail.com.

Giải pháp

Hãy hoàn tất tất cả các bước sau đây để triển khai giải pháp này.

Tạo Trình kết nối cộng đồng mới

Hãy xem Cách hoạt động của trình kết nối cộng đồng và hoàn thành Lớp học lập trình về Trình kết nối cộng đồng để bắt đầu. Sử dụng Công cụ dành cho nhà phát triển để tạo trình kết nối để quá trình phát triển nhanh hơn và dễ dàng hơn.

Viết mã trình kết nối

  1. getAuthType() sẽ trả về NONE.
  2. getConfig() sẽ trả về một cấu hình trống.
    • Không bắt buộc: Nếu cần thông tin đầu vào cụ thể để định cấu hình trang tổng quan, bạn có thể yêu cầu dữ liệu đầu vào của người dùng tại đây.
  3. getSchema() sẽ trả về giản đồ cho truy vấn của bạn.
    • Không bắt buộc: Bạn có thể thêm các trường tuỳ chỉnh và phép tính trong truy vấn SQL hoặc sử dụng các trường đã tính trong giản đồ.
  4. getData() sẽ được hoàn tất ở bước sau.

Cập nhật tệp kê khai

Xem Tài liệu tham khảo tệp kê khai và hoàn tất tệp kê khai với tất cả thông tin bắt buộc, trong đó có:

  1. đặt dataStudio.forceViewersCredentials thành true.
  2. đặt dataStudio.advancedServices.data thành true.
  3. Đối với oauthScopes, hãy thêm https://www.googleapis.com/auth/userinfo.emailhttps://www.googleapis.com/auth/script.external_request. Hãy xem bài viết Phạm vi uỷ quyền cho Apps Script để biết thêm thông tin.
    • Có điều kiện: Thêm tất cả phạm vi liên quan cho dịch vụ được dùng trong trình kết nối.

Tệp kê khai sẽ có dạng như sau:

{
  ...
  "dataStudio": {
    "forceViewersCredentials": true,
    "advancedServices": {
       "data": true
    },
    ...
  }
  "oauthScopes": [
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/userinfo.email"
    ],
  ...
}

Triển khai tài khoản dịch vụ

  1. Tạo tài khoản dịch vụ trong dự án trên Google Cloud. Đây sẽ là dự án thanh toán của bạn.
  2. Hãy đảm bảo tài khoản dịch vụ này có quyền truy cập vào BigQuery trong dự án trên đám mây.
    • Những vai trò bắt buộc đối với việc quản lý danh tính và quyền truy cập (IAM): BigQuery Data Viewer, BigQuery Job User
  3. Hãy tải tệp JSON xuống để nhận khoá tài khoản dịch vụ. Lưu trữ các khoá trong thuộc tính tập lệnh của dự án trình kết nối.
  4. Thêm thư viện OAuth2 cho Apps Script vào dự án Apps Script.
  5. Triển khai mã OAuth2 bắt buộc cho tài khoản dịch vụ:
    var SERVICE_ACCOUNT_CREDS = 'SERVICE_ACCOUNT_CREDS';
    var SERVICE_ACCOUNT_KEY = 'private_key';
    var SERVICE_ACCOUNT_EMAIL = 'client_email';
    var BILLING_PROJECT_ID = 'project_id';
    
    /**
     * Copy the entire credentials JSON file from creating a service account in GCP.
     */
    function getServiceAccountCreds() {
      return JSON.parse(scriptProperties.getProperty(SERVICE_ACCOUNT_CREDS));
    }
    
    function getOauthService() {
      var serviceAccountCreds = getServiceAccountCreds();
      var serviceAccountKey = serviceAccountCreds[SERVICE_ACCOUNT_KEY];
      var serviceAccountEmail = serviceAccountCreds[SERVICE_ACCOUNT_EMAIL];
    
      return OAuth2.createService('RowLevelSecurity')
        .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
        .setTokenUrl('https://accounts.google.com/o/oauth2/token')
        .setPrivateKey(serviceAccountKey)
        .setIssuer(serviceAccountEmail)
        .setPropertyStore(scriptProperties)
        .setCache(CacheService.getScriptCache())
        .setScope(['https://www.googleapis.com/auth/bigquery.readonly']);
    }
    

Triển khai getData()

  1. Tạo truy vấn BigQuery.
    • Sử dụng email, tra cứu mối liên kết giữa email và dữ liệu.
    • Sử dụng mệnh đề JOIN và/hoặc WHERE để lọc dữ liệu.
  2. Nhận email của người dùng hiệu quả (tham chiếu danh tính người dùng).
  3. Sử dụng Dịch vụ nâng cao của Looker Studio để trả về cấu hình truy vấn từ getData.
    • Truyền truy vấn đã tạo, dự án thanh toán và mã thông báo OAuth của Tài khoản dịch vụ.
    • Có điều kiện: Nếu lấy dữ liệu đầu vào của người dùng thông qua trình kết nối getConfig, bạn nên kết hợp dữ liệu đó dưới dạng tham số BigQuery.

Tạo trang tổng quan

  1. Tìm hiểu cách hoạt động của quy trình triển khai và phiên bản đối với trình kết nối.
  2. Tạo quá trình triển khai chính thức cho trình kết nối.
  3. Sử dụng quy trình Triển khai phiên bản chính thức để tạo nguồn dữ liệu và báo cáo mới trong Looker Studio.
  4. Thêm tất cả bảng và biểu đồ trong báo cáo.
  5. Trang tổng quan hiện đã sẵn sàng để bạn chia sẻ với người dùng.

Cung cấp trang tổng quan cho người dùng

  1. Chia sẻ tập lệnh trình kết nối với những người dùng đã chọn hoặc với "Bất kỳ ai có đường liên kết".
  2. Chia sẻ trang tổng quan với những người dùng đã chọn hoặc với "Bất kỳ ai có đường liên kết".
  3. Không bắt buộc: Sử dụng dịch vụ rút ngắn URL để tạo đường liên kết ngắn cho URL trang tổng quan. Chia sẻ URL rút gọn với người dùng của bạn. Thao tác này giúp thay thế URL của trang tổng quan sau này nếu cần.
  4. Không bắt buộc: Đo lường mức sử dụng trang tổng quan bằng cách thiết lập Google Analytics cho báo cáo của bạn.

Mã ví dụ