Laravel是否有任何内置功能可以引发权限错误?

时间:2014-06-28 22:35:31

标签: php laravel-4

现在,当用户尝试保存/编辑他们不应该做的事情时(可能是通过黑客攻击表单来提交某些数据),我用403中止了

public function store() {
    $data = $_POST;

    if(!array_key_exists('company_id',$data)) {
        $data['company_id'] = Auth::user()->company_id;
    }

    if(!(Auth::user()->hasRole('super') || $data['company_id'] == Auth::user()->company_id)) App::abort(403,"Cannot edit customers that do not belong to your company");
    ...

我没有可以抛出某种异常,是吗?我不喜欢硬编码#403; 403"无处不在,我不确定这是最好的事情。

我想我想将用户踢到某种错误页面,这些页面会因为他们的不良行为而责骂他们并在​​某处记录黑客攻击。

1 个答案:

答案 0 :(得分:1)

我通常会使用路由过滤器执行此操作。这使得它在它到达路线之前检查auth是否通过。您可以在application / routes.php文件中添加以下内容:

Route::filter('company', function()
{
  if(!(Auth::user()->hasRole('super') 
       || Input::get('company_id', Auth::user()->company_id)
          == Auth::user()->company_id)) {
     //do stuff to log that this happened
     return Redirect::to('your_error_page');
  }
});

Route::any('store', array('before' => 'company', function()
{
   //this would be your function "store"
   return View::make('store');
});

所以,这就是你的商店路线,在我们运营之前,我们首先要确保它通过"公司"过滤器 - 检查他们是否具有角色" super"或者,如果提交的company_id等于用户的公司ID(或者如果他们没有提交company_id,我们会将其默认为用户的公司ID,在这种情况下我们知道它会通过)。

如果它没有通过过滤器,我们会以您想要的任何方式记录这种情况,然后将它们重定向到错误页面。

但是现在,只要你想确保满足company_id条件,你就可以添加" company"到"之前"路线的一部分。