برای مدیریت متمرکز دسترسی به منابع، میتوانید از حسابهای سرویس در رابطهای انجمن خود استفاده کنید. یک مورد معمول استفاده، واگذاری دسترسی به دادههایی است که کاربران نمیتوانند با استفاده از اعتبار خود به آن دسترسی داشته باشند.
برای آشنایی با موضوع ، درک حسابهای سرویس را مرور کنید.
مزایا
- میتوانید صورتحساب را برای دسترسی به دادهها ادغام کنید.
- شما می توانید لایه کنترل دسترسی خود را در کانکتور خود پیاده سازی کنید.
- شما می توانید دسترسی به داده ها یا منابعی را که اعتبار کاربر به آنها دسترسی ندارد واگذار کنید.
مراحل پیاده سازی
- برای پلتفرمی که دادهها را از آن واکشی میکنید، یک حساب سرویس ایجاد کنید.
- مجوزهای لازم را برای حساب سرویس ارائه دهید تا بتواند به منابع مورد نیاز دسترسی پیدا کند.
- اطلاعات کاربری حساب سرویس را در ویژگی های اسکریپت رابط خود ذخیره کنید.
- در طول اجرای رابط، از اعتبارنامه های ذخیره شده برای واکشی داده های مورد نیاز استفاده کنید.
- اختیاری : منطق کنترل دسترسی را برای فیلتر کردن داده ها پیاده سازی کنید.
مثال: دسترسی به BigQuery با سرویسهای پیشرفته استودیوی Looker و یک حساب سرویس
شما در حال ساخت راه حلی هستید که در آن کاربران شما داشبوردهایی را از جدول BigQuery بسازند. اگر کاربران شما از رابط BigQuery استودیوی Looker استفاده می کنند، به جدول BigQuery دسترسی خواندن نیاز دارند. آنها همچنین به یک حساب صورتحساب برای Google Cloud Platform (GCP) نیاز دارند. مراحل زیر نحوه استفاده از یک حساب سرویس برای تجمیع صورتحساب و واگذاری دسترسی به دادههای BigQuery را نشان میدهد.
- یک حساب سرویس در پروژه GCP مورد نظر خود ایجاد کنید .
- مطمئن شوید که حساب سرویس میتواند کارهای BigQuery ایجاد کند و دادههای جدول مورد نیاز را مشاهده کند. برای جزئیات بیشتر به BigQuery Access Control مراجعه کنید.
- یک کلید برای حساب سرویس ایجاد کنید و اعتبارنامه ها را در ویژگی های اسکریپت رابط خود ذخیره کنید.
- کتابخانه OAuth2 Apps Script را در پروژه Apps Script خود قرار دهید.
- برای تابع
getData
خود، حساب سرویس را احراز هویت کنید و یک نشانه دسترسی ایجاد کنید. محدوده OAuth2 را رویhttps://www.googleapis.com/auth/bigquery.readonly
تنظیم کنید. - رمز دسترسی را با سایر موارد پیکربندی در پاسخ
getData
برگردانید.
در زیر یک مثال کامل از کد اتصال است:
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(); }