【问题标题】:Most effective way of protecting a view in Laravel 4.2?在 Laravel 4.2 中保护视图的最有效方法是什么?
【发布时间】:2015-05-22 23:16:39
【问题描述】:

编辑:

所以,关于身份验证和密码的问题似乎有点混乱。我会澄清的。

在我的应用中,任何经过身份验证的用户都可以创建一个团队并成为其队长。但在此过程中,系统会提示他们定义一个必须用于编辑团队信息(例如头像、电子邮件、成员等)的团队密码

因此,我需要让版本视图只有该团队的队长可以访问,并且如果他拥有正确的团队密码。我所说的“身份验证”的意思是检查该用户是否是队长以及团队密码是否是数据库中团队的密码($team->password)。这与 Sentry 认证的用户无关。对于那个很抱歉。

因此,我需要保护该团队的版本免受任何其他可能尝试访问它的用户的影响。希望现在清楚了。

主要问题:

我有一个只有特定用户才能看到的视图,并且只有当他输入正确的密码时(如在个人信息编辑页面或类似页面中)。因此,即使它的路由设置为 GET,也需要保护该视图免受恶意攻击。

我尝试了两种方法,但都没有成功。

  1. 设置显示身份验证页面的 GET 路由。使用与验证用户后显示视图相同的 URL 设置 POST 路由。 (不起作用:无法弄清楚如何再次将用户重定向到 POST 路由,因此他们不必在每次更改片段信息时都进行身份验证。)
  2. 通过视图对用户进行身份验证。也就是说,仅当这是正确的用户时才使用@if 子句来显示视图。 (不起作用:密码需要通过表单发送。它不是用户的密码,所以我无法通过视图内的Auth::User()Sentry::getUser() 访问它。)

所以我的问题是:有没有更简单的方法可以做到这一点?最常用或最好的方法是什么?这是我使用 Laravel 的第一个真正的应用程序,所以我还没有这些东西的经验。

提前致谢!

【问题讨论】:

    标签: php authentication laravel laravel-routing cartalyst-sentry


    【解决方案1】:

    我记得你的最后一个问题,但由于你没有提供更新,我也无法发布任何内容。尽管如此,你让它变得比现在更复杂。

    Route.php

    Route::get('login', 'LoginController@getLogin');
    Route::post('login', 'LoginController@postLogin');
    Route::group(['before' => 'authentication'], function(){
        Route::get('profile' => 'ProfileController@profile');
        //All protected routes here
    });
    

    我在这里所做的是,我创建了一个过滤器authentication,它将针对组内的所有路由运行。

    现在,让我们定义过滤器。

    Route::filter('authentication', function()
    {
        if ( ! Sentry::check())
        {
            return Redirect::action('LoginController@getLogin');
        }
    });
    

    这只是一个简单的过滤器,它将检查用户是否登录。如果用户没有登录,它会将用户重定向到login 路由,表单将在该路由处提供。

    控制器:

    public function getLogin()
    {
        if(Sentry::check())
        {
            return Redirect::action('ProfileController@profile');
        }
    
        return View::make('login');
    }
    
    public function postLogin()
    {
        //put the validation rules here and validate. as far as i remember, you know how to do it.
    
        if($validator->passes())
        {
            try
    {
        // Login credentials
        $credentials = array(
            'email'    => 'john.doe@example.com',
            'password' => 'password',
        );
    
        // Authenticate the user
        $user = Sentry::authenticate($credentials, false);
        return Redirect::action('ProfileController@profile');
    }
    catch (Cartalyst\Sentry\Users\LoginRequiredException $e)
    {
        echo 'Login field is required.';
    }
    catch (Cartalyst\Sentry\Users\PasswordRequiredException $e)
    {
        echo 'Password field is required.';
    }
    catch (Cartalyst\Sentry\Users\WrongPasswordException $e)
    {
        echo 'Wrong password, try again.';
    }
    catch (Cartalyst\Sentry\Users\UserNotFoundException $e)
    {
        echo 'User was not found.';
    }
    catch (Cartalyst\Sentry\Users\UserNotActivatedException $e)
    {
        echo 'User is not activated.';
    }
    
    // The following is only required if the throttling is enabled
    catch (Cartalyst\Sentry\Throttling\UserSuspendedException $e)
    {
        echo 'User is suspended.';
    }
    catch (Cartalyst\Sentry\Throttling\UserBannedException $e)
    {
        echo 'User is banned.';
    }
    
    
    
    
    }
        }
    

    在 catch 块中,执行所需的操作。例如如果您想从错误重定向到登录,则将错误添加到消息包中(如果您不知道如何,请click here 了解详细信息)并重定向到登录表单。

    或者,如果它是 ajax 数据,您可以将错误作为 json 返回,然后在客户端解析它们,同时在 ajax 失败时显示错误消息。

    如果用户没有登录,那么访问所有这些受保护的路由将引发重定向,并且用户将被重定向到登录表单。成功登录后,他将被重定向到他的个人资料页面。另一方面,如果登录用户尝试转到登录表单,那么他将被重定向到个人资料页面,因为登录用户不应该看到登录表单。

    更新 #1

    这比你想象的要容易。

    伪代码。

    • 第一次检查用户是否登录。如果没有,则将他重定向到登录页面。
    • 2,如果他登录了,当他去url(球队的密码页面)时,检查他是否是队长(数据库调用)。如果不是,则将他重定向到其他页面或向他显示 403 禁止页面
    • 3rd,如果他是队长,请给他看表格。并设置一些会话,以便在后续调用中,您可以参考该令牌检查授权。
    • 4、如果认证正确,则将他带到编辑页面。否则,带他到第 3 步,并显示错误消息,以便该人知道输入密码时出错。

    【讨论】:

    • 嗨,@itachi!我创建了另一个问题,因为我不再寻求解决该路线冲突。我宁愿寻找一种更好的方法来实现这种保护。也就是说,我不认为你明白我的意思。我正在寻找的这种身份验证与 Sentry 或 Laravel 中的 Auth 模型无关。我什至已经拥有您在我的应用程序中编写的所有代码,它们运行良好,防止未经身份验证的用户访问视图。我会更新问题以使其更清楚。
    • 我已经更新了 :) 顺便说一句,我也尝试过制作一个路由过滤器(就像你写的那个),它做了这个“第二次身份验证”但没有成功。也许这是不可能的,或者我只是不知道该怎么做。
    • 谢谢,@itachi。我终于解决了路线问题,按照这些步骤几乎让一切正常。如果不是因为我缺乏使用会话的知识,它已经解决了。你能通过显示一些代码来帮助解决这个问题吗?我尝试在身份验证后将Session::push 与电子邮件和团队密码一起使用,并在每次使用Session::has 对GET 函数进行身份验证视图之前对其进行检查。现在发生的情况是,即使您发送了错误的信息,它也会显示视图。如有必要,我可能会用一些代码更新问题。提前致谢!
    • 另外,我所说的表明Session 模型保存的信息在会话到期后不会被删除。我已经尝试删除会话(服务器端)和清除浏览器上的 cookie。尽管如此,if (Session::has('user')) 子句始终会触发并授予对视图的访问权限。由于缺乏经验,我可能做错了什么):
    猜你喜欢
    • 2015-06-05
    • 2020-09-26
    • 1970-01-01
    • 2021-04-10
    • 2015-02-19
    • 2011-06-04
    • 2016-07-08
    • 2015-10-28
    • 2015-03-14
    相关资源
    最近更新 更多