laravel授权策略中的访客用户

时间:2016-09-04 10:06:14

标签: php laravel-5 laravel-5.2

我使用policies进行用户授权。如何为访客用户使用策略?

这是我的代码:

在控制器中:

class PostController extends Controller
{
    public function index(Post $post)
    {
        $this->authorize($post);
        return $post->all();
    }
}

在政策中:

class PostPolicy
{
    // This function executes only for authenticated users.
    // I want to use it for guest users too
    public function index(User $user)
    {            
        return $user->can('get-posts');
    }
}

4 个答案:

答案 0 :(得分:8)

首先建立一个新的服务提供商:

php artisan make:provider GuestServiceProvider

然后用以下方法编辑GuestServiceProvider.php:

public function boot()
{
    // Laravel policies only work if the user isn't null so for guest access we need to assign a dummpy user.
    // From now on to check for guest use is_null(Auth::user()->getKey())
    if(!Auth::check()) {
        $userClass = config('auth.providers.users.model');
        Auth::setUser(new $userClass());
    }
}

现在,策略将适用于访客用户,您可以在策略中通过执行以下操作来检查访客:

if(is_null(Auth::user()->getKey())){
    // it's a guest
}

这实际上意味着如果用户没有id,那么它不是真正的用户,因此必须是访客。

答案 1 :(得分:1)

Laravel 5.7现在具有内置的功能(PHP> = 7.1)See the docs on the new Gate。对于使用较旧版本的任何人,这是我的解决方案。做一个小助手来使用authorizeForUser上的Illuminate\Foundation\Auth\Access\AuthorizesRequests方法。它将所有本机功能保持不变。扩展您的控制器:

use App\User;

public function authorizeAnyone($ability, $arguments = []) {
   list($ability, $arguments) = $this->parseAbilityAndArguments($ability, $arguments);
   return $this->authorizeForUser( auth()->user() ?? new User(), $ability, $arguments);
}

然后,只要您想对来宾检查政策的地方,请使用

$this->authorizeAnyone();

代替

$this->authorize();

如果您不想扩展控制器,也可以致电(例如):

$this->authorizeForUser( auth()->user() ?? new User, 'index', $post );

答案 2 :(得分:1)

在您的 PostPolicy 中更改此内容

STATIC_URL = '/static/'
ASGI_APPLICATION = "core.routing.application"
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels.layers.InMemoryChannelLayer"
    }
}

到:

class PostPolicy{
// This function executes only for authenticated users.
// I want to use it for guest users too
public function index(User $user)
{            
    return $user->can('get-posts');
}
}

source

答案 3 :(得分:0)

我认为最简单的方法是使用Auth中间件进行保护。 或检查用户是否在政策中进行了身份验证