Добавление нескольких владельцев для записей Google App Maker - PullRequest
4 голосов
/ 21 сентября 2019

Мне нужна помощь с безопасностью модели данных Google App Maker.Я хочу установить несколько владельцев для одной записи.Как текущий пользователь + назначенный администратор + супер администратор.Мне это нужно, потому что все записи могут иметь разных владельцев и супер-владельцев / администраторов.Я знаю, что мы можем указать Google App Maker на поле, содержащее электронную почту владельца записи, и мы можем установить это поле для текущего пользователя во время создания записи.

record.Owner = Session.getActiveUser().getEmail();

Я хочу знать, возможно ли иметь владельцев полей или иметь несколько полей, таких как owner1, owner2, а затем назначить уровни доступа для owner1, owner2 ...

или как мы можем программно контролировать доступ/ security / разрешения записей?

1 Ответ

4 голосов
/ 23 сентября 2019

Решение, которое я бы использовал для этого, определенно включает поле в записи, которое содержит разделенную запятыми строку всех пользователей, которые должны иметь к ней доступ.Я работал над следующим примером, чтобы лучше объяснить, что я имею в виду.

Я создал модель, которая называется Documents и выглядит так:

enter image description here

На странице у меня есть таблица и кнопка для добавления новых записей документа.Страница выглядит следующим образом:

enter image description here

Когда я нажимаю кнопку Добавить документ , появляется диалоговое окно, которое выглядит следующим образом:

enter image description here

Логика для кнопки SUBMIT в приведенной выше форме следующая:

widget.datasource.item.owners = app.user.email;
widget.datasource.createItem(function(){
  app.closeDialog();
});

Это автоматически назначит создателя записи право собственности.Чтобы добавить дополнительных владельцев, я делаю это в форме редактирования.Форма редактирования появляется, когда я нажимаю кнопку edit внутри строки записи.Выглядит это так:

enter image description here

Как видите, я использую виджет списка, чтобы контролировать, кто является владельцами.Для этого необходимо использовать настраиваемое свойство <List>String в диалоговом окне редактирования, и это будет источник данных виджета списка.В данном случае я назвал это владельцев .Я применил следующее к событию onClick кнопки редактирования:

var owners = widget.datasource.item.owners;
owners = owners ? owners.split(",") : [];
app.pageFragments.documentEdit.properties.owners = owners;
app.showDialog(app.pageFragments.documentEdit);

Кнопка add над виджетом списка имеет следующую логику для onClick обработчик события:

widget.root.properties.owners.push("");

Виджет TextBox внутри строки виджета списка имеет следующую логику для обработчика события onValueEdit :

widget.root.properties.owners[widget.parent.childIndex] = newValue;

И кнопка CLOSE имеет следующую логику для обработчика событий onClick :

var owners = widget.root.properties.owners || [];
if(owners && owners.length){
  owners = owners.filter(function(owner){
    return owner != false; //jshint ignore:line
  });
}
widget.datasource.item.owners = owners.join();
app.closeDialog();

Поскольку я хочу создатьлогика, которая будет загружать записи только для авторизованных пользователей, тогда мне пришлось использовать скрипт запроса в источнике данных, который будет служить этой цели.Для этого я создал эту функцию на серверном скрипте:

function getAuthorizedRecords(){
  var authorized = [];
  var userRoles = app.getActiveUserRoles();
  var allRecs = app.models.documents.newQuery().run();
  if(userRoles.indexOf(app.roles.Admins) > -1){
    return allRecs;
  } else {
    for(var r=0; r<allRecs.length; r++){
      var rec = allRecs[r];
      if(rec.owners && rec.owners.indexOf(Session.getActiveUser().getEmail()) > -1){
        authorized.push(rec);
      }
    }
    return authorized;
  }  
}

А затем на источнике данных documents я добавил в скрипт запроса следующее:

return getAuthorizedRecords();

enter image description here

Это решение будет загружать все записи для пользователей с правами администратора, но для пользователей без прав администратора, оно будет загружать только записи, где их электронная почта находится у владельцев поле записи.Это самое элегантное решение, которое я мог придумать, и я надеюсь, что оно служит вашей цели.

Ссылки:
https://developers.google.com/appmaker/models/datasources#query_script
https://developers.google.com/appmaker/ui/binding#custom_properties
https://developers.google.com/appmaker/ui/logic#events
https://developers -dot-devsite-v2-prod.appspot.com / appmaker / scripting / api / client # Запись

...