# Automatizované nastavování práv pro uživatele či skupinu, přes DB

### Otázka

Jak automatizovat nastavování práv pro uživatele či skupinu, přes DB?

[![image-1691050271761.png](https://doc.eainfoport.cz/uploads/images/gallery/2023-08/scaled-1680-/image-1691050271761.png)](https://doc.eainfoport.cz/uploads/images/gallery/2023-08/image-1691050271761.png)

### Odpověď

EaInfoport má dvě tabulky pro osobní oprávnění (uživatel a skupina). Pro uživatele se tabulka jmenuje `package\_access\_user` a pro skupiny `package\_access\_group`.

Popíšu zde postup pro skupiny, protože primárně doporučujeme nastavovat oprávnění pro skupiny, ale pro uživatele je postup obdobný.

Pro zápis do této tabulky jsou pro nás důležité 4 hodnoty. ID skupiny, ID repozitáře, GUID package(balíčku), ID oprávnění.

ID skupiny si můžeme vytáhnout například podle jména skupiny:

```sql
SELECT g.Id
FROM AspNetGroups g
WHERE g.Name = 'Jméno skupiny';
```

ID repozitáře si můžeme vytáhnout například podle jména repozitáře:

```sql
SELECT r.Id
FROM Repositories r
WHERE r.Name = 'Jméno repozitáře';
```

Výpis ID oprávnění pro každý typ:

- Owner má ID 1
- Read má ID 5
- Edit má ID 6
- Review má ID 8
- Delete má ID 10

Pozor! GUID balíčku se musí nacházet v našem vybraném repozitáři!

Insert script, který zapíše Read oprávnění pro skupinu 'Jméno skupiny' v repozitáři 'Jméno repozitáře' na balíčku s GUID '{00GUID00-0000-0000-0000-000PACKAGE00}'. Sloupeček Access ignorujeme, nastavujeme 0.

```sql
INSERT INTO `infoport`.`package_access_group` (`GroupId`, `Access`, `RepositoryId`, `Package`, `RelationTypeId`) VALUES (
  (SELECT g.Id
	FROM AspNetGroups g
	WHERE g.Name = 'Jméno skupiny'),
  0,
  (SELECT r.Id
	FROM Repositories r
	WHERE r.Name = 'Jméno repozitáře'),
  '{00GUID00-0000-0000-0000-000PACKAGE00}', '5');
```

*Pro uživatele bude postup stejný, ale budeme zapisovat do tabulky `package\_access\_user` a budeme vybírat ID uživatele z tabulky AspNetUsers.*

Defaultní oprávnění najdeme v tabulce `package\_acess`. Důležité jsou sloupečky Package, RepositoryId, DefaultReadAllowed.

- Do Package se vložen Guid balíčku
- RepositoryId obsahuje číslo repozitáře v kterém se balíček nachází
- DefaultReadAllowed je sloupec pro defaultní čtení. 1 značí, že je čtení povoleno. 0 značí, že je čtení zakázáno. Null značí, že se čtení dědí z **Parenta**.

Rooty musí mít nastavené default pro DefaultReadAllowed! Nesmí obsahovat Null!

[![image-1727859185695.png](https://doc.eainfoport.cz/uploads/images/gallery/2024-10/scaled-1680-/image-1727859185695.png)](https://doc.eainfoport.cz/uploads/images/gallery/2024-10/image-1727859185695.png)

<sup>*<span style="color: #000000;">Scripty jsou udělané pro MySQL.</span>*</sup>

Popíšu zde také popis vyhodnocování, aby nenastala záměna.

**Osobní oprávnění vždy aplikuje negaci na nastavené defaultní oprávnění!**

Podívejme se na tento jednoduchý příklad. Balíček 1 má dva podřadné balíčky 2 a 3.

[![Snímek obrazovky 2024-08-09 134909.png](https://doc.eainfoport.cz/uploads/images/gallery/2024-08/scaled-1680-/snimek-obrazovky-2024-08-09-134909.png)](https://doc.eainfoport.cz/uploads/images/gallery/2024-08/snimek-obrazovky-2024-08-09-134909.png)

Pokud máme nastaveno na balíčku 1 defaultní čtení povoleno a na balíček 2 spustíme INSERT osobního oprávnění na čtení, tak EaInfoport vypočítá pro danou skupinu/uživatele na balíčku 2 zákaz.

Dále pokud máme nastaveno na balíčku 3 defaultní čtení zakázáno a spustíme INSERT osobní oprávnění na čtení, tak EaInfoport vypočítá pro danou skupinu/uživatele na balíčku 3 čtení.

Pozn. V případě přímých zásahu do databáze EaInfoport je nutný restart EaInfoportu!!!