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

Bir projemizde söyle bir kurgu var.
1-) Firma, Rolleri kendi belirlemelidir.
2-) Firma, rollere göre sayfalar erişime açıp kapatabilmelidir.
Örneğin;
A firması uygulamamızı satın aldı.Rolleri kendine uygun yapıda sisteme ekleyecek.
A firmasının Rolleri : Admin, Personel, Rapor vs

B firma uygulamayı satın aldı. Rolleri kendine özgü belirleyecek.
B firması Rolleri : Supervisor, Çaycı, Kasa vs.

Kurgu bu şekilde olacaktır.

Benim incelediğim role ve permissionlarda genellikle kod icerinde her bir class içerisindeki constructor bölümüne ya middleware yazılıyor. Ya da her bir çalışan fonksiyonun içerisinde kod parçacığı ekleniyor. Bu istenilen bir durum değildir.

Sistemi yormadan bu yapıyı sizce nasıl geliştirmeliyiz. Önerilerinizi bekliyorum.
Herkese Saygılar..

    echo75 Rol ve yetkiler kullanıcı tarafından eklenmez. Rol ve yetkileri önce oluşturursunuz ve sisteminizi ona göre dizayn edersiniz. Kullanıcı sadece diğer kullanıcının rol ve yetkilerini seçer.

    Öteki türlü action bazlı bir mimari ile uygulamayı oluşturmanız lazım, yani bütün işlemler birer action olarak hazırlanacak. CreateUser diye bir action olacak, verilen veriye göre kullanıcı oluşturacak. Bu aksiyonlar ile aynı isimde yetkiler olacak ve rolleri bu yetkiler ile eşleştireceksiniz. Bir yerde CreateUser çalıştı mı içeride önce mevcut kullanıcının bu aksiyonu çalıştırma yetkisi var mı onu kontrol edecek vs...

    İlk cümlede dediğim gibi; ne yaparsanız yapın bir şeyleri önceden belirleyip sisteme koymanız lazım, ister yetki olsun ister aksiyon olsun, kullanıcı sadece taşları birleştirir, öteki türlü kod yazması gerekiyor çünkü.

    Kod yazabilsin, rol ve yetki gibi şeyleri kafasına göre dizayn edebilsin derseniz bir script dili oluşturabilirsiniz. Syntax, parser, compiler vs. tecrübeli 3 kişilik bir ekibin en az 6 ayını alır.

      Selam mgsmus
      Geri dönüş ve değerli yorumunuz için teşekkürler. Söyle bir mantık ile yapabiliriz düşüncesi doğdu.
      Tablolarımız Role,PermissionPage,UserPermission

      Role(id,company_id,name)
      PermissionPage(id,company_id,page_name,page_slug)
      UserPermission(id,role_id,permission_page_id,read,update,create,delete)

      Tablo genel hattı ile böyle olsun. Eksik - fazlalık olabilir . Sadece kurgu için üzerinden konuşuyorum.
      Middleware kodu yazıp company üzerinden rolleri kontrol yaptırmak hata mı olur ? Doğru bir yaklaşım açısı mıdır ?
      Biraz düz mantık düşünüyor olabiliriz.
      Değerli yorumlarınızı bekliyorum...

        echo75 Böyle kısır olur, pivot çalışmanız lazım. Tablolar şöyle olabilir:

        roles:
        id, name

        +----+-------+
        | id | name  |
        +----+-------+
        |  1 | Admin |
        +----+-------+

        permissions:
        id, name

        +----+-------------+
        | id |    name     |
        +----+-------------+
        |  1 | create-page |
        |  2 | edit-page   |
        |  3 | delete-page |
        +----+-------------+

        role_permission: (Hangi rol hangi yetkiye sahip)
        role_id, permission_id

        +---------+---------------+
        | role_id | permission_id |
        +---------+---------------+
        |       1 |             1 |
        |       1 |             2 |
        |       1 |             3 |
        +---------+---------------+

        roleables: (Hangi model hangi role sahip, burada MorphToMany kullanacaksınız)
        role_id, roleable_type, roleable_id

        +---------+--------------------+-------------+
        | role_id |   roleable_type    | roleable_id |
        +---------+--------------------+-------------+
        |       1 | App\Models\User    |           5 |
        |       1 | App\Models\User    |           6 |
        |       1 | App\Models\Company |          14 |
        +---------+--------------------+-------------+

        Bu tabloya göre User:5, User:6 ve Company:14 Admin rolüne, dolayısıyla create-page, edit-page ve delete-page yetkilerine sahip. Bu şekilde User dışında başka modellere de rol yetki ataması yapmak isterseniz bu şekilde yapılabilir.

        Anladığım kadarıyla Page var ve kullanıcının hangi sayfa üzerinde ne yapabileceğini kontrol etmek istiyorsunuz. Onun için öyle bir tablo tutulabilir:

        ownerships (Hangi modeller hangi modellere sahip, burada MorphToMany kullanacaksınız)
        owner_type, owner_id, entity_type, entity_id

        +--------------------+----------+-----------------+-----------+
        |     owner_type     | owner_id |   entity_type   | entity_id |
        +--------------------+----------+-----------------+-----------+
        | App\Models\User    |        5 | App\Models\Page |         6 |
        | App\Models\User    |        5 | App\Models\Page |        11 |
        | App\Models\Company |        1 | App\Models\Page |         6 |
        +--------------------+----------+-----------------+-----------+

        Bu tabloya göre User:5, Page:6 ve Page:11 üzerinde işlem yapmaya yetkili; Company:6 ise sadece Page:6 üzerinde yetkisi var. Bu durumda User:5 Admin olduğu için Page:6 ve Page:11 üzerinde create-page, edit-page ve delete-page yetkilerine sahip. Yine aynı şekilde polimorfik many-to-many olduğu için modeller sadece Page değil diğer modelleri de sahiplenebilir.

        Bu yapıyı kurduktan sonra middleware ve policy kullanarak yetkilendirme altyapısını hazırlayabilirsiniz. Her ihtiyacınızı karşılar mı bilmem ama yol göstereceğini düşünüyorum.

          mgsmus Bilgilendirme için çok teşekkür ederim. Netleştirmek adına soruyorum. Projemizde farklı firmaların farklı departmanları olduğu için farklı rollere sahip olması gerekiyor. Bu yapıda sanki rolleri programcı belirleyip programcının kurgusuna bağlı gibi geldi. Yanlış anlamışsam düzeltin lütfen. Tekrardan yazdıklarınız için teşekkürler.

            echo75 Rolleri kullanıcı oluşturabilir, bu yapıda görevi sadece yetkileri gruplamak. Rol olmasa da olur, yetkileri direkt kullanıcıya da verebilirsiniz ama yetkileri kullanıcı oluşturamaz, onlar sizin uygulamanızın dinamikleri.

            Yetkileri kullanıcı oluşturamaz derken kullanıcı için şunu yapabilirsiniz:

            permissions:
            id, name, entity, c, r, u, d

            +----+-------------+-----------------+---+---+---+---+
            | id |    name     |     entity      | c | r | u | d |
            +----+-------------+-----------------+---+---+---+---+
            |  1 | create-user | App\Models\User | 1 | 0 | 0 | 0 |
            |  1 | read-user   | App\Models\User | 0 | 1 | 0 | 0 |
            |  1 | update-user | App\Models\User | 0 | 0 | 1 | 0 |
            |  1 | delete-user | App\Models\User | 0 | 0 | 0 | 1 |
            +----+-------------+-----------------+---+---+---+---+

            Bu şekilde yetkileri kendi oluşturuyormuş gibi gözükse de buradaki c, r, u, d kısmını sisteminize uygulamanız gerektiğinden aslında yine sadece taşları birleştirmiş oluyor. Kullanıcıların yetkileri oluşturamamasından kastım bu. Ayrıca gerçek dünyada yetki sadece CRUD izinlerinden ibaret değil. Bunu aşmak için yetki tipleri oluşturabilirsiniz, CRUD sadece biri olur.

            Benim tavsiyem yetkileri siz oluşturun ve sisteminizi ona göre dizayn edin. Kullanıcının rolleri oluşturmasına izin verin ama sisteminizde role göre işlem yapmayın, rolü sadece bir kullanıcıya toplu yetki vermek için bir grup olarak düşünün. Bana göre şöyle bir yapı tüm ihtiyaçlarınızı çözecektir:

              mgsmus İyi bir yol izlenimi verdiniz. Çok teşekkür ederim.