Giriş yapmadınız.

#1 07.12.2018 16:02:10

egemen
Üye
Kayıtlı: 20.04.2016
Mesajlar: 36

Kullanıcı yetkilerini bulmak

Merhaba, laracast da laravel 5.1 de çekilen "ACL in Laravel: Roles and Permissions" videosundan yararlanarak rol, yetki ve kullanıcı rollerini oluşturdum.
Tablolarda role =  admin, editor ... ,
permissions  tablosu  = index_post, edit_post, delete_post....
role_user tablosunda role_id  user_id  = 1,1  2,1   şeklinde.

Balde kısmında @can('edit_form') Güncelle @endcan  şeklinde kontrol sağlanıyor fakat url yi "site.com/post/1/edit" olarak çağırdığımda PostController a geçiş yapıyor.

Kullanıcının yetkisini Controllerda nasıl kontrol edebilirim? Laravel policy  denedim, o da sadece postu açan kullanıcıyı kapsıyor (doğru anladıysam)
AuthServiceProvider ım şu şekilde;

AuthServiceProvider
public function boot()
    {
        $this->registerPolicies();

        // Rol ve yetkiler  // Laravel'in Kapısı ile izinleri dinamik olarak kaydedin.
        foreach ($this->getPermissions() as $permission) {            
            Gate::define($permission->name, function ($user) use ($permission) {
                return $user->hasPermission($permission);
            });
        }
        
    }
    // Yetkileri al  |   Site izinleri koleksiyonunu getir.
    protected function getPermissions()
    {
        return Permission::with('roles')->get();
    }

User Modelinde

...
public function roles()
    {
        return $this->belongsToMany(Role::class);
    }

    // Verilen rolü kullanıcıya atayın.
    public function assigRole($role)
    {
        return $this->roles()->save(
            Role::whereName($role)->firstOrFail()
        );
    }
    
    // Kullanıcı Rol kontrolü  // $user->haRole('menager')
    // Kullanıcının verilen role sahip olup olmadığını belirleyin.
    public function hasRole($role)
    {
        if (is_string($role)) { // contains = içeren
            return $this->roles->contains('name', $role);
        }
        // intersection  ==  kesişim
        return !! $role->intersect($this->roles)->count();
    }

   //Kullanıcının verilen izni gerçekleştirip gerçekleştiremeyeceğini belirleyin.   
    public function hasPermission(Permission $permission)
    {
        return $this->hasRole($permission->roles);
    }

Çevrimdışı

#2 07.12.2018 17:03:56

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

Yanıt: Kullanıcı yetkilerini bulmak

Bu sayfada middleware kullanım örnekleri var:
https://laravel-news.com/authorization-gates

Takıldığınız yer olursa yazarsınız.

Çevrimdışı

#3 09.12.2018 21:27:50

evrend
Üye
Yer: DÜZCE
Kayıtlı: 26.05.2014
Mesajlar: 377
Website

Yanıt: Kullanıcı yetkilerini bulmak

Eğer ACL yapısını kendiniz hazırlamak için özel bir sebebiniz yoksa spatie/laravel-permission sizin için bunları hazır olarak sunmaktadır. spatie'nin paketleri sık güncellenir. Ben güvenilir kabul ediyor ve projelerimde kullanıyorum.

Kendi hazırladığınız yapı için örnek middleware'i inceleyebilirsiniz. Kaynak kodu ve reposu aşağıdadır.
https://github.com/spatie/laravel-permission
https://github.com/spatie/laravel-permi … leware.php

<?php

namespace Spatie\Permission\Middlewares;

use Closure;
use Spatie\Permission\Exceptions\UnauthorizedException;

class PermissionMiddleware
{
    public function handle($request, Closure $next, $permission)
    {
        if (app('auth')->guest()) {
            throw UnauthorizedException::notLoggedIn();
        }

        $permissions = is_array($permission)
            ? $permission
            : explode('|', $permission);

        foreach ($permissions as $permission) {
            if (app('auth')->user()->can($permission)) {
                return $next($request);
            }
        }

        throw UnauthorizedException::forPermissions($permissions);
    }
}

Yukarıdaki Middleware'in rotalarda kullanımı aşağıdaki gibidir.

<?php
Route::namespace('Herkod')->group(['middleware' => ['auth:api']], function () {

    Route::group(['prefix' => 'archives'], function () {

        Route::get('/', ['as' => 'archives', 'uses' => 'Archive\Controllers\[email protected]'])->middleware('permission:archives');
        Route::get('/{id}', ['as' => 'archives.single', 'uses' => 'Archive\Controllers\[email protected]'])->middleware('permission:archives.single');
        Route::post('/', ['as' => 'archives.create', 'uses' => 'Archive\Controllers\[email protected]'])->middleware('permission:archives.create');
        Route::post('/{id}', ['as' => 'archives.update', 'uses' => 'Archive\Controllers\[email protected]'])->middleware('permission:archives.update');
        Route::delete('/{id}', ['as' => 'archives.delete', 'uses' => 'Archive\Controllers\[email protected]'])->middleware('permission:archives.delete');

    });
});

Son düzenleyen evrend (09.12.2018 21:31:44)


Unutmayın, HERKOD aynı değildir.
Fiyat/Performans Cloud için: Digital Ocean.
Ayda 2,5$'a 512Mb ram, 1Core CPU Cloud için: Vultr.

Çevrimdışı

#4 25.12.2018 22:21:39

egemen
Üye
Kayıtlı: 20.04.2016
Mesajlar: 36

Yanıt: Kullanıcı yetkilerini bulmak

Controller lara şu şekilde ekleyerek çözdüm.
Teşekkürler.

 public function index()
    {
        if (\Gate::denies('index-user')) {
            return abort(403, 'Yetkisiz eylem.');
        }

Çevrimdışı

#5 26.12.2018 08:53:05

deathisonitsway
Üye
Kayıtlı: 01.02.2016
Mesajlar: 476

Yanıt: Kullanıcı yetkilerini bulmak

egemen yazdı:

Controller lara şu şekilde ekleyerek çözdüm.
Teşekkürler.

 public function index()
    {
        if (\Gate::denies('index-user')) {
            return abort(403, 'Yetkisiz eylem.');
        }

Her controller içinde bunu yazmak design hatası olur.En iyi tabirle; saçma.
Bunu gösterilen şekilde ara katman kullanarak yapmalısınız.


Laravel does not save you. Php knowledge only save you. Do not become a Laravel programmer, just the opposite,become php developer.

Çevrimdışı

Forum alt kısmı