बेहतर सेवाओं के साथ BigQuery की लाइन-लेवल की सुरक्षा

उदाहरण के लिए, मान लें कि आपको अपनी बिक्री के लिए कोई समाधान बनाना है संगठन. बिक्री संगठन को कई क्षेत्रों में बांटा गया है, जहां हर क्षेत्र का अपना रीजनल मैनेजर है. BigQuery में मौजूद बिक्री के डेटासेट में बिक्री है देश/इलाके और तारीख के हिसाब से रकम.

सुझाए गए समाधान में एक डैशबोर्ड होगा, जहां रीजनल मैनेजर सिर्फ़ अपने क्षेत्रों का बिक्री डेटा देख सकते हैं.

ज़रूरी शर्तें

  • डैशबोर्ड देखने वाले लोग, Google खाते से साइन इन करेंगे.
  • मैपिंग, उपयोगकर्ता के ईमेल और उनके डेटा/पंक्तियों के बीच उपलब्ध है का ऐक्सेस है.
  • BigQuery डेटा को ऐक्सेस करने के लिए, सेवा खाते का इस्तेमाल किया जाएगा. इसलिए बिलिंग इसे डैशबोर्ड की सेवा देने वाली कंपनी एक ही जगह से मैनेज और मैनेज करेगी.

सीमाएं

  • डैशबोर्ड को पहले हर दर्शक से एक बार अनुमति लेनी होगी व्यू.
  • दर्शक न तो डैशबोर्ड में बदलाव कर सकते हैं और न ही उसे दूसरों के साथ शेयर कर सकते हैं.
  • अगर आप Workspace के ग्राहक हैं और आपके एडमिन ने शेयर करने की सुविधा बंद कर दी है Drive में मौजूद फ़ाइलों को “वे सभी लोग जिनके पास लिंक है” पर ले जाने के लिए, शेयर करने की सुविधा हटाएं प्रतिबंधित या समाधान तैयार करने के लिए Gmail.com खाते का इस्तेमाल करते हैं.

समाधान

समाधान को लागू करने के लिए, यह तरीका अपनाएं.

नया कम्यूनिटी कनेक्टर बनाएं

समीक्षा करें समुदाय कनेक्टर कैसे काम करते हैं और समुदाय कनेक्टर को पूरा करें कोडलैब (कोड बनाना सीखना) शुरू करें. कनेक्टर बनाने के लिए डेवलपर टूल का इस्तेमाल करके अधिक तेज़ और आसान डेवलपमेंट प्रोसेस है.

कनेक्टर कोड लिखें

  1. getAuthType() को NONE लौटाना चाहिए.
  2. getConfig() से कॉन्फ़िगरेशन वाला फ़ील्ड खाली होना चाहिए.
    • ज़रूरी नहीं: अगर आपको डैशबोर्ड को कॉन्फ़िगर करने के लिए खास इनपुट की ज़रूरत है, तो यहां उपयोगकर्ता के इनपुट का अनुरोध कर सकते हैं.
  3. getSchema() को आपकी क्वेरी के लिए स्कीमा देना चाहिए.
  4. getData() का मैंडेट बाद के चरण में पूरा होगा.

मेनिफ़ेस्ट अपडेट करें

मेनिफ़ेस्ट रेफ़रंस देखें और सभी ज़रूरी शर्तों के साथ मेनिफ़ेस्ट को पूरा करें जानकारी, जिसमें ये शामिल हैं:

  1. dataStudio.forceViewersCredentials को true पर सेट करें.
  2. dataStudio.advancedServices.data को true पर सेट करें.
  3. oauthScopes के लिए, https://www.googleapis.com/auth/userinfo.email और https://www.googleapis.com/auth/script.external_request. अनुमति देना ज़्यादा जानकारी के लिए, Apps Script के दायरे.
    • शर्त: इसमें इस्तेमाल की गई सेवाओं के लिए सभी ज़रूरी दायरे जोड़ें कनेक्टर.

मेनिफ़ेस्ट इस तरह दिखना चाहिए:

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

सेवा खाता लागू करना

  1. अपने Google Cloud प्रोजेक्ट में सेवा खाता बनाएं. यह आपके बिलिंग प्रोजेक्ट चुनें.
  2. पक्का करें कि क्लाउड प्रोजेक्ट में, इस सेवा खाते के पास BigQuery का ऐक्सेस है.
    • पहचान और ऐक्सेस मैनेजमेंट (आईएएम) से जुड़ी ज़रूरी भूमिकाएं: BigQuery Data Viewer, BigQuery Job User
  3. सेवा खातों की कुंजियां पाने के लिए JSON फ़ाइल डाउनलोड करें. कुंजियां यहां सेव करें आपके कनेक्टर प्रोजेक्ट की स्क्रिप्ट प्रॉपर्टी.
  4. अपने Apps Script प्रोजेक्ट में, Apps Script के लिए OAuth2 लाइब्रेरी को शामिल करें.
  5. सेवा खाते के लिए, ज़रूरी OAuth2 कोड लागू करें:
    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']);
    }
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

getData() लागू करें

  1. अपनी BigQuery क्वेरी बनाएं.
    • ईमेल का इस्तेमाल करके, ईमेल और डेटा के बीच की मैपिंग देखें.
    • डेटा को फ़िल्टर करने के लिए, 'शामिल हों' और/या 'WHERE' क्लॉज़ का इस्तेमाल करें.
  2. असरदार उपयोगकर्ता का ईमेल पता (उपयोगकर्ता की पहचान का रेफ़रंस) पाएं.
  3. क्वेरी कॉन्फ़िगरेशन के लिए, Looker Studio की ऐडवांस सेवाएं का इस्तेमाल करें getData से.
    • बनाई गई क्वेरी, बिलिंग प्रोजेक्ट, और सेवा खाते को पास करना OAuth टोकन.
    • शर्त के साथ: अगर कनेक्टर getConfig के ज़रिए उपयोगकर्ता का इनपुट लिया जा रहा है, तो आपको इनपुट को BigQuery पैरामीटर के रूप में शामिल करना चाहिए.

डैशबोर्ड बनाना

  1. जानें कि कनेक्टर के लिए, डिप्लॉयमेंट और वर्शन कैसे काम करते हैं.
  2. कनेक्टर के लिए प्रोडक्शन डिप्लॉयमेंट बनाएं.
  3. प्रोडक्शन डिप्लॉयमेंट का इस्तेमाल करके इसमें डेटा सोर्स और नई रिपोर्ट बनाएं Looker Studio.
  4. रिपोर्ट में सभी टेबल और चार्ट जोड़ें.
  5. डैशबोर्ड अब आपके उपयोगकर्ताओं के साथ शेयर किए जाने के लिए तैयार है.

उपयोगकर्ताओं को डैशबोर्ड उपलब्ध कराना

  1. कनेक्टर स्क्रिप्ट को चुने हुए उपयोगकर्ताओं या “किसी भी व्यक्ति के साथ शेयर करें लिंक भी शामिल करें” चुनें.
  2. चुनिंदा उपयोगकर्ताओं के साथ डैशबोर्ड शेयर करें या “ऐसा कोई भी व्यक्ति जिसके पास लिंक” चुनें.
  3. ज़रूरी नहीं: यूआरएल छोटा करने वाली सेवा का इस्तेमाल करके, यूआरएल. छोटे किए गए यूआरएल को अपने उपयोगकर्ताओं के साथ शेयर करें. इससे गड़बड़ी के मैसेज को हटाने में मदद मिलती है उपयोग कर सकते हैं.
  4. ज़रूरी नहीं: Google Analytics सेट अप करके, डैशबोर्ड के इस्तेमाल का आकलन करें आपकी रिपोर्ट.

उदाहरण कोड

main.js

var cc = DataStudioApp.createCommunityConnector();
var scriptProperties = PropertiesService.getScriptProperties();

function isAdminUser() {
 
return true;
}

function getAuthType() {
 
var AuthTypes = cc.AuthType;
 
return cc
   
.newAuthTypeResponse()
   
.setAuthType(AuthTypes.NONE)
   
.build();
}

function getConfig(request) {
 
var config = cc.getConfig();

  config
   
.newInfo()
   
.setId('generalInfo')
   
.setText('This is an example connector to showcase row level security.');

 
return config.build();
}

function getFields() {
 
var fields = cc.getFields();
 
var types = cc.FieldType;
 
var aggregations = cc.AggregationType;

  fields
   
.newDimension()
   
.setId('region')
   
.setName('Region')
   
.setType(types.TEXT);

  fields
   
.newMetric()
   
.setId('sales')
   
.setName('Sales')
   
.setType(types.NUMBER)
   
.setAggregation(aggregations.SUM);

  fields
   
.newDimension()
   
.setId('date')
   
.setName('Date')
   
.setType(types.YEAR_MONTH_DAY);

 
return fields;
}

function getSchema(request) {
 
return {schema: getFields().build()};
}

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']);
}

var BASE_SQL =
 
'SELECT d.region, d.sales, d.date ' +
 
'FROM `datastudio-solutions.row_level_security.data` d ' +
 
'INNER JOIN `datastudio-solutions.row_level_security.access` a ' +
 
'ON d.region = a.region ' +
 
'where a.email=@email';

function getData(request) {
 
var accessToken = getOauthService().getAccessToken();
 
var serviceAccountCreds = getServiceAccountCreds();
 
var billingProjectId = serviceAccountCreds[BILLING_PROJECT_ID];
 
var email = Session.getEffectiveUser().getEmail();

 
var bqTypes = DataStudioApp.createCommunityConnector().BigQueryParameterType;

 
return cc
   
.newBigQueryConfig()
   
.setAccessToken(accessToken)
   
.setBillingProjectId(billingProjectId)
   
.setUseStandardSql(true)
   
.setQuery(BASE_SQL)
   
.addQueryParameter('email', bqTypes.STRING, email)
   
.build();
}