如何将会话变量引入到此Laravel 8应用程序的AuthServiceProvider中?
我正在开发一个具有用户、角色和权限的Laravel 8应用程序。我使用Microsoft Azure进行用户注册和登录。我首先关注了他们网站上的this tutorial。
我在routesweb.php
中使用了一个自定义中间件来区分经过身份验证的用户和来宾:
Route::group(['prefix' => 'dashboard', 'middleware' => ['checkSignedIn']], function() {
Route::get('/', [DashboardContoller::class, 'index'])->name('dashboard');
//More routes
});
我从permissions
MySQL表中获得了特定于每个用户角色的逗号分隔的用户权限列表。
我将userPermissions
变量存储在如下所示的会话中:
public function storeTokens($accessToken, $user, $user_role, $user_permissions) {
session([
'accessToken' => $accessToken->getToken(),
'refreshToken' => $accessToken->getRefreshToken(),
'tokenExpires' => $accessToken->getExpires(),
'userName' => $user->getDisplayName(),
'firstName' => $user->getGivenName(),
'lastName' => $user->getSurname(),
'userRole' => $user_role,
'userPermissions' => $user_permissions,
'userEmail' => null !== $user->getMail() ? $user->getMail() : $user->getUserPrincipalName(),
'userTimeZone' => $user->getMailboxSettings()->getTimeZone()
]);
}
这使我可以在视图(navbar.blade.php
部分)中直接从会话输出当前(已登录)用户的权限列表,如下所示:
@if(session('userPermissions'))
<ul>
@foreach (session('userPermissions') as $up)
<li>{{ $up }}</li>
@endforeach
</ul>
@endif
目标
我的意图(创建session('userPermissions')
的目的)是使用该用户在盖茨中的权限。为此,在appProvidersAuthServiceProvider.php
中,我有:
// More code
use IlluminateSupportFacadesGate;
// More code
/* View Users */
Gate::define('view-users', function() {
return in_array('view-users', session('userPermissions'));
});
在基本控制器(appHttpControllersController.php
)中,我使用use IlluminateSupportFacadesGate
导入了Gate Facade,然后在users.blade.php
@can('view-users')
<h2>Users</h2>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Role</th>
</tr>
</thead>
@if ($users)
<tbody>
@foreach ($users as $user)
<tr>
<td>{{ $user->first_name }} {{ $user->last_name }}</td>
<td>{{ $user->email }}</td>
<td>{{ $user->role }}</td>
</tr>
@endforeach
</tbody>
@endif
</table>
@endcan
问题
evan如果当前用户确实具有view-user权限(在导航栏中可见),则USERS表不存在,在AuthServiceProvider.php
中执行dd(session('userPermissions'))
将返回null
。
我的错误在哪里?
解决方案
假定您已在AppProvidersAuthServiceProvider
中注册了Policy
&;Gate
。
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
User::class => UserPolicy::class,
];
/**
* Register any application authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
// this merely maps the name of the gate
Gate::define('view-users', [UserPolicy::class, 'index']);
}
}
CLI命令:
php artisan make:policy UserPolicy --model=User
然后在class UserPolicy
中,您必须实现方法index()
。
用户甚至可以在呈现任何刀片模板之前签入控制器。
对于您的用例...请参阅以下示例:Methods Without Models或Guest Users。
当Gate
知道User $user
时,依赖session()
是没有意义的
相关文章