Most effective way of protecting a view in Laravel 4.2?


Most effective way of protecting a view in Laravel 4.2?

编辑:

因此,这个问题在身份验证和密码方面似乎有点混乱。我会澄清的。

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

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

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

主要问题:

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

我试过两种方法,但都没用。

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

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

提前感谢!

我记得你的最后一个问题,但由于你没有给出更新,我也无法发布任何内容。尽管如此,你还是让事情变得复杂起来。

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块中,执行所需的操作。例如,如果您想重定向到带有错误的登录,则将错误添加到消息包中(如果您不知道如何操作,则单击此处了解详细信息),然后重定向到登录表单。

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

如果用户没有登录,那么访问所有受保护的路由将引起重定向,用户将被重定向到登录表单。成功登录后,他将被重定向至他的个人资料页面。另一方面,如果登录用户试图转到登录表单,那么他将被重定向到配置文件页面,因为登录用户不应该看到登录表单

更新#1

这比你想象的要容易。

伪代码。

  • 首先检查用户是否已登录。如果没有,则将其重定向到登录页面
  • 第二,如果他登录了,当他访问url(球队的密码页面)时,检查他是否是队长(数据库调用)。如果没有,则将他重定向到其他页面或向他显示403禁止页面
  • 第三,如果他是队长,那么向他显示表格。并设置一些会话,以便在随后的呼叫中,您可以参照该令牌检查授权
  • 第四,如果身份验证正确,则将他带到编辑页面。否则,将他带到步骤3,并显示错误消息,以便此人知道输入密码时出错