因此,似乎问题在身份验证和密码方面有点混乱。我会澄清一下。
在我的应用中,任何经过身份验证的用户都可以创建团队并成为队长。但在此过程中,系统会提示他们定义一个团队密码,必须用它来编辑团队的信息,例如头像,电子邮件,成员等。
因此,我需要让版本视图仅对该团队的队长可访问,并且如果他拥有正确的团队密码。我对“身份验证”的意思是检查该用户是否是队长以及团队密码是否是团队中的密码($team->password
)。这与Sentry认证的用户无关。对于那个很抱歉。
因此,我需要保护该团队的版本免受可能尝试访问它的任何其他用户的影响。希望现在很清楚。
我有一个只应由特定用户看到的视图,并且只有当他输入正确的密码时(例如在个人信息编辑页面或类似的东西中)。因此,即使将其路由设置为GET,也需要保护该视图免受恶意攻击。
我尝试了两种方法,但都没有效果。
@if
子句显示视图。 (DID NOT WORK:密码需要通过表单发送。这不是用户的密码,因此我无法通过视图内的Auth::User()
或Sentry::getUser()
访问密码。)所以我的问题是:有没有更简单的方法来完成它?最常用或最好的方法是什么?这是我使用Laravel的第一个真正的应用程序,所以我还没有体验过这些东西。
提前致谢!
答案 0 :(得分:0)
我记得你的最后一个问题但由于你没有提供更新,我也无法发布任何内容。尽管如此,你使它变得复杂。
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失败时显示错误消息。
如果用户未登录,则访问所有这些受保护的路由将引发重定向,并且用户将被重定向到登录表单。成功登录后,他将被重定向到他的个人资料页面。另一方面,如果登录用户尝试转到登录表单,那么他将被重定向到配置文件页面,因为登录用户不应该看到登录表单。
比你想象的容易。
伪代码。