使用自己修改的 LogViewer 完成权限验证的坑

使用自己修改的 LogViewer 完成权限验证的坑

1.先推荐两个laravel查看日志的包

laravel-log-viewer
LogViewer

我个人推荐使用后者,前者在处理大文件log时,会解析很长时间

但是后者也有缺点:

1.只能看到logs下面的日志,如果我们的日志是分类存放的,就读不到
2.没有做权限控制

🙃 基于以上两点,我修改了这个包github,欢迎拍砖

下面来还原一下遇到的坑

1.后台验证中间件

    public function handle($request, Closure $next)
    {
        if( !authAdmin() ){
            if ($request->ajax() || $request->wantsJson()) {
                return response('Unauthorized.', 401);
            } else {
                return redirect()->guest('admins/login');
            }
        }

        return $next($request);
    }

2.authAdmin()方法

function authAdmin ()
    {
        return auth('admin')->user();
    }

3.查看log-viewer.php的配置文件

只有用我更新的这个包才能有这个middleware配置

    'middleware'=>'auth.admin'

因为我后台认证也是走的这个中间件,那么我的这个包也是走的这个中间件,我就以为可以认证

问题

1.每次访问日志url的时候总是跳转到后台首页

于是我就在想:为什么会跳转到后台首页呢? 首先由一点是可以确定的,我确实是登录了后台. 那么只有一种可能,就是LogViewer并没有通过auth.admin的认证,从而跳转到了后台登录页面,然后我再后台登录页面的判断是,如果登录了,就跳转到后台首页

public function showLoginForm ()
    {
        if (authAdmin()) {
            return redirect(route('admin.index'));
        }

        return view('admin.auth.login');
    }

1.解决第一步,到中间件查看是否能获取到登录信息

>果然是null,那么就印证了我 👆 的推断
public function handle($request, Closure $next)
    {

    dd(authAdmin())
        // .....
    }

到了这里,为什么是null呢,因为我认证用的是驱动是session,所以我猜测,LogViewer并没有启用session,所以也就获取不到我的认证信息

2.查看路由中间件

php artisan route:list

通过查看Middleware我们发现,确实只有admin.auth中间件,那么我们要启用session的话,laravel有一个现成的web中间件,

3.于是修改log-viewer.php的middleware配置

'middleware'=>['auth.admin','web']

最后还是不行,明明用了web,也启用了为什么还是不行了

😆 😆 😆 MDZZ了 要先启用session才能读取到数据

4.再次修改log-viewer.php的middleware配置

'middleware'=>['web','auth.admin']

5.最后走一下流程吧