Avatar billede dane022 Seniormester
30. august 2023 - 21:28 Der er 8 kommentarer

Row level security på flere kolonner

I en konkret tabel, som bygger på medarbejderdata i et organisationshierarki, kan der være flere ledere der skal have adgang til den enkelte række (leder, leders leder osv.). Helt præcist op til 3 ledere, dvs. hver række har 3 kolonner med lederes brugernavne.

Jeg troede man kunne oprette RLS på mere end én kolonne, men det kan jeg så forstå man ikke kan, hvis sikkerhedspolitikken skal være aktiv på de 3 kolonner samtidig.

Så hvad er ellers mine muligheder hvis jeg skal opnå ovenstående? Har kigget på rolleopsætning som mapper mellem date og rolle sammen, så hver bruger kan have flere adgange. Umiddelbart ville det løse det, men min viden er ikke god nok til at implementere det.

Tabel indeholdende data: "testsikkerhed", kolonner leder1, leder2, leder3.
Tabel indeholdende brugere: "Brugere", kolonner initialer, rolle

Leder1 og Initialer indeholder samme type værdi, så det vil være de 2 der evt. skal bindes sammen.
Avatar billede arne_v Ekspert
31. august 2023 - 02:59 #1
Min umiddelbare fornemmelse er at SQL Server row level security ikke er vejen frem, men at et eksplicit check i din kode er den rigtige løsning.

Hvis du kontrollerer applikationen så bare test.

Hvis du ikke kontrollerer applikationen så flyt logikken til en stored procedure og check der.
Avatar billede dane022 Seniormester
31. august 2023 - 06:05 #2
Er det sikkert nok? Som jeg forstår stored procedures, så vil sikkerheden ikke ligge i databasen, men vil ligge i php, og er derfor ikke en indbygget sikkerhed..
Avatar billede dane022 Seniormester
31. august 2023 - 06:06 #3
Der er personfølsomme oplysninger i databasen
Avatar billede dane022 Seniormester
31. august 2023 - 07:54 #4
Denne query gør hvad den skal:

select *
from Testsikkerhed AS T
join Brugere AS B ON B.Orgenhed = T.Leder1
WHERE B.Initialer = USER_NAME()

Så hvis nogen ved hvordan jeg får det omsat det til en function og policy, så er det lige præcis det jeg mangler
Avatar billede arne_v Ekspert
31. august 2023 - 18:59 #5
Hvad er konteksten?

Skal den SQL udføres fra PHP eller fra Excel?
Avatar billede dane022 Seniormester
31. august 2023 - 19:20 #6
Alle forespørgsler udføres via PHP, men på baggrund af det ønskede RLS så ser brugeren kan de rækker han/hun er berettiget til
Avatar billede dane022 Seniormester
31. august 2023 - 21:36 #7
Har kigget mere på stored procedures og det kan godt være en mulighed alligevel. Det er lykkedes at lave en stored procedure og køre den fra siden. Problemet nu, er at det er den enkelte brugers brugernavn der skal køre kaldet, men desværre oprettes forbindelsen via en servicebruger og det er jo så den bruger der kører forespørgslen og det duer ikke. Hvordan får jeg det ændret til, at det er den enkelte bruger der kører kaldet når de ikke er oprettet i databasen?

$connectionOptions = array(
            "Database" => 'Lonforhandlinger',
            "CharacterSet" => "UTF-8",
            "Uid" => 'Servicebruger',
            "PWD" => 'Kodeord',
            "TrustServerCertificate" => true
        );
Avatar billede arne_v Ekspert
01. september 2023 - 00:55 #8
Der er flere mulige løsninger, men mit forslag er:
* fortsat med at have srevice bruger connecte til databasen
* lad PHP web app authentikere windows bruger
* send brugernavn med over som argument til SP @usrnamarg
* erstat WHERE B.Initialer = USER_NAME() med WHERE B.Initialer = @usrnamarg
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester