Giriş yapmadınız.

#1 03.10.2018 11:01:12

alihankoc
Üye
Kayıtlı: 14.09.2017
Mesajlar: 53

Row Level Security (Satır Bazında Güvenlik)

Merhaba arkadaşlar,
Hepiniz mutlaka rol ve izin yönetimi ile ilgili paketler kullanmışsınızdır. Ben en çok spatie/laravel-permission paketini kullanıyorum.

Fakat şimdi biraz daha spesifik bir ihtiyacım bulunmakta. Saas bir uygulama var,
tek veritabanında
-Firmalar,
-Firmalara bağlı şubeler,
-Şubelere bağlı departmanlar,
-Departmanlara bağlı kullanıcılar,
-Kullanıcıların tablolarda oluşturduğu satırlar var.

İhtiyaçlarımız;
Öyle bir rol ve izin yönetimi kurmalıyız ki aşağıdaki ihtiyaçların tamamına cevap verebilsin.
-Bir kullanıcı sadece kendi firmasına ait veriler üzerinde çalışabilsin,
-Bir kullanıcı sadece kendi şubesine ait veriler üzerinde çalışabilsin,
-Bir kullanıcı sadece kendi şubesindeki kendi departmanında ait veriler üzerinde çalışabilsin,
-Bir kullanıcı sadece kendi verileri üzerinde çalışabilsin,
-Bir kullanıcıya A şubesindeki tüm veriler üzerinde çalışma izni varken B şubesinde sadece C departmanında bulunan kendi verileri üzerinde çalışabilsin.
-Bir kullanıcı X tablosundaki tüm verilere erişebilirken sadece 1,3,5 id li veriler üzerinde güncelleme yapabilsin, (tam tersi de olabilir)
-Bir kullanıcı X tablosundaki hiçbir veriye erişemezken sadece 1 id li veriyi görebilsin ama değiştiremesin, (tam tersi de olabilir)
-Bir kullanıcı A Firmasının kullanıcısı olmasına rağmen T şubesindeki S departmanının verilerini görebilsin, (üstte bulunan daha spesifik işlemler de dahil)
-Tüm işlem izinleri okuma, yazma, güncelleme ve silme işlemlerine göre de özelleştirilebilsin.
... benzeri şekilde devamını tahmin edebilirsiniz.

Daha önce bu kadar derin bir yetkilendirme işlemi yapmış olan var mı?
Evet ise nasıl bir yol izlediniz?
Nasıl bir veritabanı yapısı kurdunuz?
Kullandığınız paket oldu mu?
Sadece Laravel özelinde düşünmeyin, herhangi bir yazılım dilinde veya frameworkünde kullanmış olabilirsiniz. Her türlü fikre açığım.

Herkese iyi forumlar.
big_smile

Çevrimdışı

#2 03.10.2018 12:57:59

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,641
Website

Yanıt: Row Level Security (Satır Bazında Güvenlik)

Kullanıcı ve kayıt id lerini ayrı bir tabloda tutacaksınız. Role ve permission kontrolü yanında bir de bunun kontrolünü yapacaksınız. Bunun kontrolü için de Laravel içindeki Authorization'u kullanabilirsiniz.
https://laravel.com/docs/5.7/authorization

Örneğin Bir kullanıcı sadece kendi firmasına ait veriler üzerinde çalışabilsin demişsiniz. Ayrı bir tabloda user_id ve company_id tutulacak (Kullanıcının birden fazla firmada yetkili olma ihtimaline karşı)
Sonra buna bir Policy yazacaksınız: https://laravel.com/docs/5.7/authorizat … g-policies
spatie/laravel-permission Laravel Gate ile birlikte çalıştığı için $user->can(... şeklinde verilen yetkiyi daha alt seviyelerde özelleştirebilirsiniz demektir.

Çevrimdışı

#3 04.10.2018 22:47:53

kazim.karagul
Üye
Kayıtlı: 01.11.2014
Mesajlar: 177

Yanıt: Row Level Security (Satır Bazında Güvenlik)

Çalıştığım kamu kurumunda başladığımız bir projede neredeyse birebir aynı yetkilendirme sistemini yapmam gerekiyor. Bizim projedeki bir diğer fark ise bu yetki kontrolünün canlı yapılması. Örneğin ben yetkim olan bir sayfada çalışırken bir anda benim üstümdeki bir yetkili benim yetkimi alırsa o formu post ettiğimde yetkim olmadığı için anında engellemeli. Bu şekilde olunca bir de poerformans konusunu da dahil ederek uygun bir veritabanı tasarımı yapmak gerekiyor. Fikirsel olarak yapmam gerekenleri netleştirdim, bir ara kağıda döküp yapılacakları netleştirmem lazım. Ardından yetkilendirme modülünün yazımına başlayacağım. Eğer acelesi yoksa 3-4 hafta içinde yaptıklarımı/yapacaklarımı adım adım yazabilirim. Şu anda projenin diğer modülleri üzerine toplantılar devam ettiği için detaylı ilgilenmem mümkün değil.

Çevrimdışı

#4 05.10.2018 03:45:41

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,641
Website

Yanıt: Row Level Security (Satır Bazında Güvenlik)

Performans için yetkileri kalıcı olarak (rememberForever) önbellekte tutacaksınız. Cache tagging özelliği ile de işaretleyin. Yetkilerde bir değişiklik meydana geldi mi önbelleği baştan oluşturun. Cache tagging yardımı ile sadece değişiklik olan kısımları baştan oluşturmanız ekstra bir performans artışı sağlayacaktır.

Örneğin kullanıcının pages isimli bir tabloda düzenlemeye yetkili olduğu sayfalar olsun. Bu sayfa-kullanıcı ilişkisini de ayrı bir ortanca tabloda tutun. Örneğin:

+---------+------------+----------+-----------+
| user_id | allowed_to |  model   | record_id |
+---------+------------+----------+-----------+
|       1 | update     | App\Page |         3 |
|       2 | update     | App\Page |         3 |
|       1 | update     | App\Page |         4 |
+---------+------------+----------+-----------+

gibi. Tablo yapısı, ekstra tablo sayısı ve bu tablolar arasındaki ilişkiler vs sizin bu sistemi ne kadar dinamik yapacağınıza göre değişecektir. Bu üstteki basit bir örnek.

Buna bir de PagePolicy şeklinde bir policy hazırladığınızı düşünün. Bu yetkiler verilirken yetkiyi önbelleğe alacaksınız. Örneğin üstteki tabloya göre id'si 3 olan Page, id'leri 1 ve 2 olan User tarafından güncellenebilir.
Bu durumda bunu önbelleğe aldığımızı düşünürsek:

Cache::tags(['perms','pages','update','page_id:3'])->rememberForever('perms_pages_update_page_id:3', function() {
    return DB::table('perms')->where('record_id',3)->where('model', \App\Page::class)->pluck('user_id'); // [1,2]
});

Bunu da policy içerisinde

class PagePolicy
{
    public function update(User $user, Page $page)
    {
        $users = cache()->get("perms_pages_update_page_id:{$page->id}");
        return in_array($user->id, $users);
    }
}

şeklinde kullanabiliriz.

Birçok şey, kolayca yapılabilir kısacası.

Çevrimdışı

Forum alt kısmı