Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

Arkadaşlar merhaba , laravel de roller ve izinler için Authorization ve yine laravel de kullanabileceğimiz spatie gibi alanlar mevcut. Özellikle Spatie'yi biraz inceledim ve burada rollere izinler ya da izinlere roller yazabiliyoruz. Ancak burada şöyle bir durum oluşuyor ,

Diyelimki bir blog siteniz var ve burada farklı farklı roller mevcut.. Örneğin yazarlar , moderatörler vs. ve siz burda yazarlara bir yetki tanımlaması yaptığınız zaman bu tüm yazarlar için aynı olacaktır.

Ben ise her bir yazar için her bir alanı özelleştirerek yetkilendirmek istiyorum.. Örneğin A isimli yazar x,y,z işlerini yaparken a,b,c işlerini yapamasın B isimli yazar ise sadece y ve a işlemlerini yapabilsin gibi yetkileri site sahibinin ya da Adminin dağıtabileceği bir sistem yapmak istiyorum. Daha önce bu şekilde bir çalışmam oldu ancak içime çok da sinmeyen bir şekilde yaptım ,

users tablosu içerisinde her bir alan için tek tek sütun oluşturdum. (yaklaşık 30 tane oldu) ve bu alanları 1 ve 0 olacak şekilde doldurulmasını sağladım. Başlangıçta varsayılan olarak gelen değerler var ancak sonrasında admin her bir kullanıcı için bu yetkileri düzenleyebilir. Buradaki sakınca ise users tablosunun sütun sayısının 50 lere çıkması oldu.

Siz bu tarz yetkilendirme işlemlerini nasıl yapıyorsunuz ? Ya da benim gittiğim yol doğru mu ? Şimdiden teşekkür ederim.

    caglar_kocak Yetkiler rollere verilebileceği gibi direkt kullanıcılara da verilebilir. Spatie'nin paketi o şekilde çalışıyor.

    Ben users tablosunda longtext formatında permissions adında bir sütun oluşturup, model tablolarının adını çekip, (blogs, works, users, menus vs) döngüye sokup, buradaki her bir tablo için izinler (create, read, show, delete vs) oluşturuyorum. Bunu da json olarak eklediğim sütuna kaydediyorum. Daha sonrasında bir fonksiyon ile kontrol sağlıyorum. Her kullanıcı için ayrı ayrı yetkilendirme yapabiliyorsunuz böylece.

      Örneğin yazarlara post atma yetkisi verdiniz, ama tüm yazarlara vermiş olacaksınız. Siz A yazarı x, y, z kategorilerinde B yazarı da i, j, k kategorilerinde post atma yetkisi vermek istiyorsunuz.

      Rotaları korumak ile veritabanındaki bilgileri korumak farklı şeyler. Post atabilir yetksi rotaya bağlıdır. X kategorisine post atabilir yetkisi ise hem rotaya hem de veritabanındaki X kategorisine bağlıdır. Dolayısıyla biraz daha karmaşık işlere girmeniz gerekiyor.

      Bunun için Laravelde Gate ve Policy'lerden yararlanmanız lazım. Spatie doğrudan bunları da destekliyor.

      afsakar Hmmm evet bu da mantıklı , fonksiyona tek parametre verip içerde varsa true değer mi dönüyorsunuz ? Ya da iki parametre , bir user bir de izin parametresi gibi ?

        Basit olarak aşağıdaki şekilde Permission lara sahip olduğunuzu varsayalım

        1. Category Create
        2. Category Edit
        3. Post Create
        4. Post Edit

        spatie/laravel-permission paketi ile User modelinde ID si 5 olan kişiye "Category Edit" izni verebiliyorsunuz. Doğal olarak bu izni bir role tanımlayıp role ile vermediğiniz için kişiye özel olarak izin vermiş oluyorsunuz. Middleware ve blade template için directive ler ile bu izinleri kontrol edebiliyorsunuz. https://github.com/spatie/laravel-permission/blob/master/database/migrations/create_permission_tables.php.stub#L41

        Eğer daha specific olarak ID si 5 olan User'e, tüm kategoriler için belirli kategoriler için izin vereceğim diyorsanız yine bu paketi extends ederek veya buradaki mantığa benzer bir mantık kurarak yapabilirsiniz.

        caglar_kocak evet, biri tablo/modül adı, diğer parametre ise ne yapabileceği kontrolü (create, read, show, delete). Eğer o kullanıcının permissions sütununda o modül/modele ait izin varsa true döndürüyorum yoksa yetki hatası veriyorum.

        7 ay sonra

        Merhabalar;

        Konu üzerinden çok zaman geçmiş ancak bende bir şeyler yazmak istedim.
        Fazla bilgim olmadığından dolayı permission yapıları karışık geliyor bana. Bu arada Laravel'i yeni öğrenmeye başladım.
        Düz php yazarken kendimce şöyle bir sistem yaptım. Basit ama bu zamana kadar bana fazlasıyla yetti.
        Veritabanında yetkiler adında bir kolon açıp verileri aşağıdaki gibi kaydettim.

        Örnek : " admin,uyeler,uye_ekle,uye_sil,uye_duzenle,duyurular,duyuru_ekle,duyuru_duzenle,duyuru_sil " gibi.

        Daha sonra giriş yapan kullanıcıya göre veri tabanında bu verileri çekip explode ile ,( virgül)'e göre ayırıp in_array ile girmek istediği sayfa ya da yapmak istediği işleme göre yetkisinin olup olmadığının kontrolü yapıyorum.

        Bu sayede panel üzerinden istediğim kullanıcıya istediğim yetkiyi atayıp kaldırabiliyorum.

        Bu yöntem ne kadar profesyonel ya da sağlıklı bilmiyorum. Diğer yöntemler bana daha karmaşık ve uğraştırıcı geliyor.

        Açıkcası konu hakkında fikirlerinizi merak ettim.

          ramazanakcay Projeden projeye göre değişir. Sisteminizde kritik önemi olmayan bir şeyleri komplike hale getirmek iyi bir şey değil. Mevcut yaptığınız ihtiyacınızı karşılıyorsa amacınıza ulaşmışsınız demektir, basit olması onun fonksiyon ve/veya öneminde düşüşe sebep olmaz ama burada şöyle bir nokta daha var, bu RBAC (Role Based Access Control) ya da ACL (Access Control List) dediğimiz yapılar özünde belli sorunları çözmek için geliştirilmiş yapılar ve genel bir kalıbı var. Yani burada aslında bir şeyleri baştan keşfetmiyorsunuz, mevcut olan bir çözümü kullanmış oluyorsunuz. O yüzden bunları kullanmanın amacı sadece sorunu çözmek değil ayrıca hızlı bir şekilde çözüme ulaşmak.