企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 访客模式 在前面几节的中间件策略中,我们始终没有放开 `Auth/@index` 的访客访问,在未登录的情况下,直接访问将会跳转到登录页面,并且已登录用户无法浏览其他用户的页面,接下来的步骤将会解决这个问题。 ## 放开权限 由于在控制器中多个方法都被中间件拦截,现在重新编辑 `application\user\controller\Auth.php` ~~~php ... protected $middleware = [ 'UserAuthorize' => [ 'except' => [ 'create', 'save', 'index', 'read' ] ], ... ~~~ 退出登录后再次访问 http://thinkphp.test/user/auth/index ,即可看到所有用户的列表,然后我们随意点击一个用户的名字,发现页面中出现 `欢迎您` 的字样和 `编辑资料` 按钮,这是访客模式不可见的,现在我们需要一一解决。 ## 判断访客 访客分为两种: 1. 未登录用户 2. 已登录用户访问其他用户页面 非常简单的,虽然拥有两种状态,但是我们只需要在控制器中传入 `Session` 即可判断。 `application\user\controller\Auth.php` ~~~php public function read($id) { $user = User::find($id); $this->assign([ 'user' => $user, 'session' => Session::get('user') ]); return $this->fetch(); } ~~~ 再编辑前端页面 `resources\views\user\auth\read.blade.php` ~~~html @extends('_layout.default') @section('title', $user->name) @section('content') <div class="col-md-offset-2 col-md-8"> <div class="panel panel-default mt-5"> <div class="panel-heading mb-3"> <h4> @if(!is_null($session) && $session->id === $user->id) <a class="btn btn-primary" href="{{ url('user/auth/edit', ['id' => session('user.id')]) }}"> 编辑资料 </a> 欢迎您 @else 您正在查看 @endif {{ $user->name }} </h4> </div> </div> </div> @stop ~~~ 现在用不登录和登录状态随意访问其他用户的页面,可以看到以上问题均解决了。 在上一节添加删除按钮的时候,我们删除逻辑中排除了管理员自己删除自己,现在需要在前端页面中移除这个按钮。 `resources\views\user\auth\index.blade.php` ~~~html @if ($god && !$user->god) <form action="{{ url('user/auth/delete', ['id' => $user->id]) }}" method="post" class="float-right"> @php echo token() @endphp <input type="hidden" name="_method" value="DELETE"> <button type="submit" class="btn btn-sm btn-danger delete-btn">删除</button> </form> @endif ~~~ 非常简单的,只需要判断循环列表的用户 `god` 属性就行。 使用管理员登录并访问所有用户页面,可以看到所有是管理员的删除按钮全部消失了。