最近在使用后台框架Fastadmin进行开发,框架本身依托于TP5,第一次上手还是挺好用的,框架自身集成了一些常见的前端组件,对我这种前端很菜的人来讲非常友好。
今天在开发中遇到了一个常见的问题,管理员操作正常,但是普通管理操作却提示“你没有权限访问”
具体分析:
- 操作方法名
getIp
,所属控制器PonStaticBroadband
- 首先确认这个请求是个ajax请求,并非常规的一些操作,所以并没有在菜单规则中添加控制权限。
- 其次这个请求在设计中考虑的时候,仅需要已经登录即可,所以在控制器中对属性
$noNeedRight
进行了添加。
按道理来讲,这个时候任何正常登录之后的任何请求应该是正常,但实际上却并非如此;回到方法getIp
内,其实里面有个地方是这样写的$data = (new Search())->getIps($first, $num, $code);
也就是说实际上这个函数体内调用了其它控制器方法,但是来到Search
控制器里面,我对方法getIps
,同样进行了权限授权,但是依旧提示权限不正常就很尴尬了...
然后就各种查了...,最后来到后端都要继承的一个类Backend
,看到初始方法_initialize
里面,有个权限验证:
最后在来到了Auth
控制器,math
方法里面160行这句,原因也就在这里;他通过对比路由请求的‘动作’action
,和需要操作的方法看是否授权,可能有点迷...
简单讲:我的请求路由是PonStaticBroadband中的一个方法,但这个方法里面又调用了Search里面的一个方法,于是在Search里面需要做权限判断,发现我的路由请求动作action在Search是没有授权的,于是就丢出来一个没有权限访问...
解决办法:
修改一下 Search
控制器属性$noNeedRight
,暴力的直接改成protected $noNeedRight =['*']
可以解决,也可以在原有基础上增加一个 getIp
;推荐还是第二种,方便做细致的权限控制。