JOV*_*JOV 175 laravel laravel-4
这似乎是一个非常基本的流程,并且Laravel有很多很好的基本解决方案,我觉得我错过了一些东西.
用户单击需要身份验证的链接.Laravel的auth过滤器启动并将它们路由到登录页面.用户登录,然后转到他们试图在'auth'过滤器启动之前到达的原始页面.
有没有一种好方法可以知道他们最初尝试访问的页面?由于Laravel是拦截请求的人,因此我不知道在用户登录后是否跟踪某处以便轻松路由.
如果没有,我很想知道你们中的一些人是如何手动实现的.
vFr*_*sop 225
检查斯科特的答案如下.
简单的说,
在auth中间件上:
// redirect the user to "/login"
// and stores the url being accessed on session
if (Auth::guest()) {
return redirect()->guest('login');
}
return $next($request);
Run Code Online (Sandbox Code Playgroud)
登录操作:
// redirect the user back to the intended page
// or defaultpage if there isn't one
if (Auth::attempt(['email' => $email, 'password' => $password])) {
return redirect()->intended('defaultpage');
}
Run Code Online (Sandbox Code Playgroud)
在回答这个问题时,框架本身没有任何官方支持.现在你可以使用下面的bgdrl指出的方法这个方法:( 我试过更新他的答案,但似乎他不接受)
在验证过滤器上:
// redirect the user to "/login"
// and stores the url being accessed on session
Route::filter('auth', function() {
if (Auth::guest()) {
return Redirect::guest('login');
}
});
Run Code Online (Sandbox Code Playgroud)
登录操作:
// redirect the user back to the intended page
// or defaultpage if there isn't one
if (Auth::attempt(['email' => $email, 'password' => $password])) {
return Redirect::intended('defaultpage');
}
Run Code Online (Sandbox Code Playgroud)
你可以像这样实现它:
Route::filter('auth', function() {
// If there's no user authenticated session
if (Auth::guest()) {
// Stores current url on session and redirect to login page
Session::put('redirect', URL::full());
return Redirect::to('/login');
}
if ($redirect = Session::get('redirect')) {
Session::forget('redirect');
return Redirect::to($redirect);
}
});
Run Code Online (Sandbox Code Playgroud)
// on controller
public function get_login()
{
$this->layout->nest('content', 'auth.login');
}
public function post_login()
{
$credentials = [
'username' => Input::get('email'),
'password' => Input::get('password')
];
if (Auth::attempt($credentials)) {
return Redirect::to('logged_in_homepage_here');
}
return Redirect::to('login')->with_input();
}
Run Code Online (Sandbox Code Playgroud)
即使用户错过了键入的凭据,或者他没有帐户并且必须注册,在Session上存储重定向也有好处.
除了Auth之外,这还允许在会话上设置重定向,并且它会神奇地工作.
Sco*_*ers 63
由于Auth Middleware已移至服务容器,因此5.3中的Auth更改使得实现更容易,并且略微不同于5.2.
/app/Http/Middleware/RedirectIfAuthenticated.php
Run Code Online (Sandbox Code Playgroud)
稍微更改手柄功能,所以它看起来像:
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect()->intended('/home');
}
return $next($request);
}
Run Code Online (Sandbox Code Playgroud)
唯一的区别在于第4行; 默认情况下它看起来像这样:
return redirect("/home");
Run Code Online (Sandbox Code Playgroud)
由于Laravel> = 5.3在检查Auth Guard时自动保存最后的"预期"路由,因此它将更改为:
return redirect()->intended('/home');
Run Code Online (Sandbox Code Playgroud)
这告诉Laravel在登录前重定向到最后一个目标页面,否则转到"/ home"或默认发送它们的任何地方.
希望这有助于其他人 - 5.2和5.3之间的区别并不多,特别是在这方面有很多.
gia*_*kis 26
我发现这两个很棒的方法对你很有帮助.
Redirect::guest();
Redirect::intended();
Run Code Online (Sandbox Code Playgroud)
您可以将此筛选器应用于需要身份验证的路由.
Route::filter('auth', function()
{
if (Auth::guest()) {
return Redirect::guest('login');
}
});
Run Code Online (Sandbox Code Playgroud)
这种方法基本上是存储您尝试访问的页面,它会将您重定向到登录页面.
用户通过身份验证后即可致电
return Redirect::intended();
Run Code Online (Sandbox Code Playgroud)
并且它会将您重定向到您最初尝试访问的页面.
这是一个很好的方法,虽然我通常使用下面的方法.
Redirect::back()
Run Code Online (Sandbox Code Playgroud)
你可以查看这个很棒的博客.
dab*_*uno 20
您可以使用Redirect :: intent函数.它会将用户重定向到他们在被authenticaton过滤器捕获之前尝试访问的URL.如果预期的目标不可用,则可以为该方法提供回退URI.
在登录/注册后:
return Redirect::intended('defaultpageafterlogin');
Run Code Online (Sandbox Code Playgroud)
Fed*_*ngo 11
我在语言选择器代码上使用了一段时间.只要您只需要返回1页就可以了,它可以正常工作:
return Redirect::to(URL::previous());
Run Code Online (Sandbox Code Playgroud)
它不是最强大的解决方案,但它非常简单,可以帮助解决一些难题.:)
Mev*_*mir 11
将LoginControllers构造函数更改为:
public function __construct()
{
session(['url.intended' => url()->previous()]);
$this->redirectTo = session()->get('url.intended');
$this->middleware('guest')->except('logout');
}
Run Code Online (Sandbox Code Playgroud)
它将在登录页面之前将您重定向回页面(2页返回).
小智 10
以下方法适用于 Laravel 8。
/app/Http/Controllers/Auth/AuthenticatedSessionController.php
Run Code Online (Sandbox Code Playgroud)
预期的 url 将存储在创建时的会话中:
/**
* Display the login view.
*
* @return \Illuminate\View\View
*/
public function create()
{
session(['url.intended' => url()->previous()]);
return view('auth.login');
}
Run Code Online (Sandbox Code Playgroud)
成功登录后,如果会话中存在预期的 URL,则重定向到该 URL,否则重定向到默认 URL:
/**
* Handle an incoming authentication request.
*
* @param \App\Http\Requests\Auth\LoginRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function store(LoginRequest $request)
{
$request->authenticate();
//in case intended url is available
if (session()->has('url.intended')) {
$redirectTo = session()->get('url.intended');
session()->forget('url.intended');
}
$request->session()->regenerate();
if ($redirectTo) {
return redirect($redirectTo);
}
return redirect(RouteServiceProvider::HOME);
}
Run Code Online (Sandbox Code Playgroud)
小智 6
对于laravel 5.*尝试这些.
return redirect()->intended('/');
Run Code Online (Sandbox Code Playgroud)
要么
return Redirect::intended('/');
Run Code Online (Sandbox Code Playgroud)
小智 5
我略微调整了您的(ViníciusFragosoPinheiro)代码,并将以下内容放在filters.php中
Route::filter('auth', function()
{
// If there's no user authenticated session
if (Auth::guest()) {
// Flash current url to session and redirect to login page
Session::flash('redirect', URL::full());
return Redirect::guest('login');
}
});
Run Code Online (Sandbox Code Playgroud)
然后在我的AuthController.php中:
// Try to log the user in.
if (Auth::attempt($userdata)) {
if ($redirect = Session::get('redirect')) {
return Redirect::to($redirect);
} else {
// Redirect to homepage
return Redirect::to('your_default_logged_in_page')->with('success', 'You have logged in successfully');
}
} else {
// Reflash the session data in case we are in the middle of a redirect
Session::reflash('redirect');
// Redirect to the login page.
return Redirect::to('login')->withErrors(['password' => 'Password invalid'])->withInput(Input::except('password'));
}
Run Code Online (Sandbox Code Playgroud)
请注意,'redirect'如果存在身份验证问题,则会重新显示会话数据.这可以在任何登录失败期间保持重定向不变,但是如果用户在任何时候点击,则下一个登录过程不会被会话数据中断.
您还需要在显示登录表单时重新刷新数据AuthController,否则链断开:
public function showLogin()
{
// Reflash the session data in case we are in the middle of a redirect
Session::reflash('redirect');
// Show the login page
return View::make('auth/login');
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
107183 次 |
| 最近记录: |