İçeriğe geç
Educora
Üniversite25 dk13 / 14

Erişim hakları, RLS ve entegrasyon: JSON, XML, HTTP servisleri

Roller ve haklarla kimin neyi görebileceğini ve değiştirebileceğini belirle, kayıt düzeyinde güvenliği (RLS) kur, verileri JSON ve XML ile alışveriş et, bir HTTP servisi yaz ve harici API'leri çağır.

Kendini test et
Bu derste öğreneceklerin
  • Temel ve etkileşimli haklarla roller tasarlamak ve hakları kodda denetlemek
  • Oturum parametreleriyle bir RLS kısıtlaması kurmak ve etkilerini açıklamak
  • JSON/XML ile çalışmak, bir HTTP servisi oluşturmak ve harici bir HTTP API çağırmak

Gerçek bir projede kod yazmak işin yalnızca yarısıdır. Depocu Murad yalnızca kendi deposunun belgelerini görmeli, maaşları ise hiç görmemelidir. Bir çevrim içi mağazanın web sitesi stok bilgisini her dakika 1C'den almalı, 1C ise döviz kurlarını bir bankadan yüklemelidir. Bu ders bir 1C geliştiricisinin iki profesyonel becerisine ayrılmıştır: güvenlik ve entegrasyon.

Roller ve erişim hakları

Rol (Общие › Роли), her metadata nesnesi için bir haklar kümesidir. Bir kullanıcıya birden fazla rol verilebilir ve haklar toplanır: rollerden en az biri bir hakkı veriyorsa kullanıcı o hakka sahip olur. “Yasaklayan” rol yoktur; bu yüzden rolleri küçük ve amaca yönelik oluştur: Кладовщик (depocu), Бухгалтер (muhasebeci), ЧтениеСправочников (katalog okuma).

HakAnlamı
Чтение, Добавление, Изменение, Удалениеtemel haklar: kod dahil verilerle her türlü çalışma
Просмотр, Редактирование, Интерактивное добавление, Интерактивное удалениеetkileşimli haklar: kullanıcının formlarda yapabildikleri
Проведение, Отмена проведенияbelgeleri işleme ve işlemeyi geri alma
Администрирование, Монопольный режимkonfigürasyon düzeyinde hizmet hakları
1C
Если Не ПравоДоступа("Изменение", Метаданные.Документы.РасходТовара) Тогда
    ВызватьИсключение "Недостаточно прав для изменения документа";
КонецЕсли;

Если РольДоступна("Бухгалтер") Тогда
    // показываем дополнительные колонки
КонецЕсли;
ПравоДоступа() (AccessRight) belirli bir hakkı, РольДоступна() (IsInRole) bir rolü denetler. Hakkı denetlemek daha güvenilirdir: roller sonradan yeniden adlandırılabilir veya bölünebilir.

Kayıt düzeyinde güvenlik (RLS)

Rol “РасходТовара belgeleri okunabilir” der ama “hangileri” demez. Bunun için RLS (kayıt düzeyinde güvenlik) vardır: Чтение, Добавление, Изменение ve Удаление haklarına sorgu diline benzer bir koşul yazılır. Koşulda genellikle oturum parametreleri kullanılır; bunlar oturum başlarken УстановкаПараметровСеанса (SessionParametersSetting) işleyicisinde doldurulur.

1C
// Модуль сеанса
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    // НастройкиПользователей - наш общий модуль
    ПараметрыСеанса.ТекущийСклад = НастройкиПользователей.СкладТекущегоПользователя();
КонецПроцедуры
1C Query
ГДЕ Склад = &ТекущийСклад
Кладовщик rolünde РасходТовара belgesinin Чтение hakkına ait kısıtlama metni: kullanıcı yalnızca kendi deposunun belgelerini görür. Birden fazla rolün kısıtlamaları ИЛИ (OR) ile birleşir.

RLS'nin iki önemli sonucu vardır. Birincisi, okuma kısıtlaması olan bir tabloya yapılan sorgu, kullanıcının göremeyeceği bir kayda rastlarsa hata verir; yalnızca izin verilen kayıtları sessizce almak için ВЫБРАТЬ РАЗРЕШЕННЫЕ (SELECT ALLOWED) yazılır. İkincisi, platform koşulu her sorguya ekler; bu yüzden karmaşık RLS tabanı yavaşlatabilir. Sunucu kodunun hakları bilerek aşması gerektiğinde УстановитьПривилегированныйРежим(Истина) (SetPrivilegedMode) veya Привилегированный bayraklı bir ortak modül kullanılır.

Örnek 1: Murad'ın deposu

Depocu Murad yalnızca “Gence” deposunun giriş ve çıkış belgelerini görmeli, oluşturmalı ve işlemeli, ürün kataloğunu ise yalnızca okumalıdır. Erişim yapısını tasarla.

Çözümü göster
1) Кладовщик rolü: ПриходТовара ve РасходТовара için Чтение, Добавление, Изменение, Просмотр, Редактирование, Проведение; Товары için yalnızca Чтение ve Просмотр.
2) ТекущийСклад oturum parametresi (tür СправочникСсылка.Склады), УстановкаПараметровСеанса içinde kullanıcının ayarlarından doldurulur.
3) Belgelerin Чтение ve Изменение haklarına RLS: ГДЕ Склад = &ТекущийСклад.
4) Rapor ve liste sorgularında ВЫБРАТЬ РАЗРЕШЕННЫЕ.
5) Test: Murad olarak giriş yap ve “Bakü” deposuna ait bir belgenin ne görünebildiğinden ne de oluşturulabildiğinden emin ol.

Veri biçimleri: JSON ve XML

1C
Данные = Новый Структура;
Данные.Вставить("code", "0001");
Данные.Вставить("name", "Çay 100 q");
Данные.Вставить("price", 4);

Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
ТекстJSON = Запись.Закрыть();

Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстJSON);
Прочитано = ПрочитатьJSON(Чтение);   // Структура
Чтение.Закрыть();
Сообщить(Прочитано.name);
Beklenen çıktı
Çay 100 q
ЗаписатьJSON (WriteJSON) yapıları, dizileri ve ilkel değerleri metne çevirir, ПрочитатьJSON (ReadJSON) ise geri çevirir.

XML için ЗаписьXML (XMLWriter) ve ЧтениеXML (XMLReader) nesneleri, yapılandırılmış alışveriş için ise XDTO mekanizması vardır: СериализаторXDTO bir katalog öğesini ya da belgeyi bütün olarak XML'e yazar. Dağıtık tabanlar arasındaki alışverişte alışveriş planları (Планы обмена) değişiklikleri kendileri izler; tipik konfigürasyonlar ise birbirleriyle EnterpriseData biçiminde veri alışverişi yapar.

HTTP servisleri, web servisleri ve harici API'ler

Bir HTTP servisi (Общие › HTTP-сервисы) 1C'yi bir REST API'ye dönüştürür. Bir kök URL'si (örneğin shop), URL şablonları (örneğin /items/{code}) ve her şablon için yöntemleri (GET, POST…) vardır. Taban bir web sunucusunda yayımlandıktan sonra servis https://server/base/hs/shop/items/0001 gibi bir adreste yanıt verir. Her yöntemin işleyicisi, bir HTTPСервисЗапрос (istek) alan ve bir HTTPСервисОтвет (yanıt) döndüren bir fonksiyondur.

1C
// HTTP-сервис Shop, шаблон URL /items/{code}, метод GET
Функция ItemsGET(Запрос)
    Код = Запрос.ПараметрыURL["code"];
    Товар = Справочники.Товары.НайтиПоКоду(Код);
    Если Товар.Пустая() Тогда
        Возврат Новый HTTPСервисОтвет(404);
    КонецЕсли;

    Данные = Новый Структура("code, name, price", Код, Товар.Наименование, Товар.Цена);
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    ЗаписатьJSON(Запись, Данные);

    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    Ответ.УстановитьТелоИзСтроки(Запись.Закрыть());
    Возврат Ответ;
КонецФункции
1C
// Вызов внешнего API из 1С
Соединение = Новый HTTPСоединение("api.example.com", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL);
ЗапросHTTP = Новый HTTPЗапрос("/v1/rates?base=AZN");
Ответ = Соединение.Получить(ЗапросHTTP);
Если Ответ.КодСостояния <> 200 Тогда
    ВызватьИсключение СтрШаблон("Сервис курсов вернул код %1", Ответ.КодСостояния);
КонецЕсли;

Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Курсы = ПрочитатьJSON(Чтение, Истина);   // Соответствие
Чтение.Закрыть();
HTTPСоединение (HTTPConnection) parametreleri: sunucu, bağlantı noktası, kullanıcı, parola, vekil sunucu, zaman aşımı (saniye) ve güvenli bağlantı (HTTPS).
YöntemNe zaman seçilir
HTTP servisi (REST, JSON)web siteleri, mobil uygulamalar, modern sistemler
Web servisi (SOAP, WSDL)SOAP gerektiren kurumsal ve kamu sistemleri; tüketmek için WS-ссылки (WS referansları)
Standart OData arayüzükod yazmadan nesnelere REST erişimi (/odata/standard.odata/)
Alışveriş planları + XMLşubeler, 1C tabanları arasında eşitleme
Örnek 2: çevrim içi mağaza için API

Web sitesi, ürün koduna göre ürünün adını ve fiyatını almalıdır. Servisi, yanıtlarını ve güvenliğini tasarla.

Çözümü göster
1) HTTP servisi Shop, kök URL shop, şablon /items/{code}, yöntem GET, işleyici ItemsGET.
2) Yanıtlar: ürün bulundu — 200 ve JSON {"code", "name", "price"}; bulunamadı — 404; kod boş — 400.
3) Güvenlik: web sitesi için ayrı bir kullanıcı ve yalnızca Товары üzerinde Чтение hakkı olan bir APIShop rolü; yalnızca HTTPS.
4) Yayımlama: Администрирование › Публикация на веб-сервере (Web sunucusunda yayımla), HTTP servislerini işaretle.
5) Test: https://server/base/hs/shop/items/0001 adresini bir tarayıcıda veya curl ile aç.

Önemli noktalar

  • Roller hakları toplar; yasaklayan rol yoktur — rolleri küçük ve amaca yönelik tut.
  • RLS koşulları Чтение/Добавление/Изменение/Удаление haklarına eklenir ve oturum parametrelerini kullanır.
  • RLS olan tablolarda ВЫБРАТЬ РАЗРЕШЕННЫЕ hata yerine yalnızca izin verilen kayıtları döndürür.
  • JSON: ЗаписатьJSON/ПрочитатьJSON; alışılmadık anahtarlar için ПрочитатьJSON(Чтение, Истина).
  • Bir HTTP servisi /hs/<kök URL>/ adresinde REST API sunar; harici API'ler HTTPСоединение ile, zaman aşımı ve HTTPS ile çağrılır.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Bir kullanıcının iki rolü var: biri Изменение hakkı veriyor, diğeri vermiyor. Sonuç nedir?