我使用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');
}
}
答案 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');
}
}
答案 3 :(得分:0)
我认为最简单的方法是使用Auth中间件进行保护。 或检查用户是否在政策中进行了身份验证