Php 如何允许管理员使用laravel删除/编辑用户信息?
我有一个仪表板,其中我有多个用户,我想唯一的管理员能够编辑或删除用户信息,普通用户应该能够编辑/删除他的帐户 这是我到目前为止所做的尝试 管理中间件Php 如何允许管理员使用laravel删除/编辑用户信息?,php,html,laravel,authentication,laravel-blade,Php,Html,Laravel,Authentication,Laravel Blade,我有一个仪表板,其中我有多个用户,我想唯一的管理员能够编辑或删除用户信息,普通用户应该能够编辑/删除他的帐户 这是我到目前为止所做的尝试 管理中间件 use Closure; use Auth; class IsAdmin { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next
use Closure;
use Auth;
class IsAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Auth::user() && Auth::user()->admin == 1) {
return $next($request);
}
return redirect('/home');
}
}
这里是users.index表体,我在这里显示数据
<tbody>
@foreach($users as $user)
<tr>
<td>
{{ $user->name }}
</td>
<td>
{{ $user->email }}
</td>
<td>
{{ $user->created_at->format('Y-m-d') }}
</td>
<td class="td-actions text-right">
@if ($user->is_admin != auth()->id())
<form action="{{ route('user.destroy', $user) }}" method="post">
@csrf
@method('delete')
<a rel="tooltip" class="btn btn-success btn-link" href="{{ route('user.edit', $user) }}" data-original-title="" title="">
<i class="material-icons">edit</i>
<div class="ripple-container"></div>
</a>
<button type="button" class="btn btn-danger btn-link" data-original-title="" title="" onclick="confirm('{{ __("Are you sure you want to delete this user?") }}') ? this.parentElement.submit() : ''">
<i class="material-icons">close</i>
<div class="ripple-container"></div>
</button>
</form>
@else
<a rel="tooltip" class="btn btn-success btn-link" href="{{ route('profile.edit') }}" data-original-title="" title="">
<i class="material-icons">edit</i>
<div class="ripple-container"></div>
</a>
@endif
</td>
</tr>
@endforeach
不幸的是,上述解决方案任何用户都可以编辑或删除用户信息
我需要做什么才能实现我想要的?确保数据库用户表中有角色列或属性。创建这样的中间件
php artisan make:middleware AuthMiddleware
然后
在内核中
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'admin' => \App\Http\Middleware\YourMiddleware::class,
保护你的路线
Route::get('admin/profile/{id}/delete', function () {
//
})->middleware('admin');
希望这有帮助
public function handle($request, Closure $next)
{
if (Auth::user() && Auth::user()->is_admin == 1) {
return $next($request);
}
您正在检查
Auth::user->admin==1
请根据您的Auth::user()
数据将此条件更改为Auth::user()->is_admin==1
,我不知道您是如何设置Auth和user的
通常,当用户登录时,您可以使用auth功能仅设置用户基本信息以及用户是否登录
我假设您有is_admin,因为列是user表
在您的用户模型中,您需要有一个功能来检查用户是否是管理员
您拥有包含用户id的Auth::id(),然后从查询中检查此用户id是否为admin或no,并将其返回为true或false
public function isAdmin() {
$user= App\user::find(Auth::id());
// you can also put it in session
// this session line can add in handle function and call $user->is_admin()
$this->request->session()->put('is_admin', $user->is_admin);
return $user->is_admin; // you can add if check to return true false if you want
}
在你看来
@if ($user->is_admin()){
// everything here is only accessible if its true
}
另外,可能会有代码错误,只需将web路由中的逻辑应用到您的管理中间件,并将其包装到中间件组中,即可删除和编辑路由
// -- admin --
Route::middleware(['admin'])->group(function () {
这意味着只有管理员才能访问这些路由,否则用户将被重定向。然后,如果经过身份验证的用户与通过路由的用户相同,您可以编辑管理中间件以接受请求。当然,测试应该是
@if($user->is\u admin)
您比较错误,is\u admin和auth id不同。只需使用is_admin或true或1@RiggsFolly您的解决方案现在普通用户可以编辑或删除管理员帐户,而不是他的帐户:(那么,var\u dump($user->is\u admin)是什么呢
show,请添加到问题中问题是,$user->is_admin对于循环中的每个记录,您需要获取登录用户的is_admin检查,并且在users.index上?@user9964622在users.index路由::get('admin/profile/index',function(){/});那么users.index呢?
@if ($user->is_admin()){
// everything here is only accessible if its true
}
// -- admin --
Route::middleware(['admin'])->group(function () {