当前位置: 首页 > 知识库问答 >
问题:

laravel哨兵重定向::计划不工作

芮化
2023-03-14

我正在尝试在我的应用程序中正确设置sentry软件包。

我可以登录一个用户进出和保护路由,但我似乎不能得到重定向::打算正常工作。我的理解是,用户在被引导到登录页面之前,会被带回到他们最初调用的路由。目前,它只是继续重定向到默认页面。

在我的路线上。php我已设置以下组:

Route::group(array('before' => 'sentryAuth'), function () {...}

在这个组中,我已经放置了所有受保护的路由

在我的过滤器里。php我有以下过滤器:

Route::filter('sentryAuth', function () {

if (!Sentry::check()) {

    return Redirect::route('login');
} 
});

路由::过滤器('sentryGuest',函数(){

if (Sentry::check()) {
    return Redirect::intended('dashboard');
}
});

在我的userController中,我有以下代码:

public function postAuthenticate()
{
    try {
        // Set login credentials
        $credentials = array(
            'email' => Input::get('email'),
            'password' => Input::get('password')
        );

        // Try to authenticate the user
        $user = Sentry::authenticate($credentials, false);
    } 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\UserNotFoundException $e) {
        echo 'User was not found.';
    }
    catch (Cartalyst\Sentry\Users\WrongPasswordException $e) {
        echo 'Wrong password, try again.';
    }
    catch (Cartalyst\Sentry\Users\UserNotActivatedException $e) {
        echo 'User is not activated.';
    }

    if (!Sentry::check()) {
        return Redirect::to('user/login');
    } else {
        return Redirect::intended('dashboard');
    }
}

我尝试在未登录的情况下访问“预订/创建”页面。我被带到登录页面,登录,但它会带我到仪表板,而不是预订/创建。

我是不是遗漏了什么?是否有额外的代码,我需要得到预期的工作??

共有3个答案

史智志
2023-03-14

@灵隐的回答非常好。这里有一个稍微不同的版本。

路线。php

// NOTE: do NOT name your filter "auth" as it will not override
//       Laravel's built-in auth filter and will not get executed
Route::filter( 'sentryAuth', function()
{
    // check if logged in or not
    if ( ! Sentry::check() )
    {
        // the guest() method saves the intended URL in Session
        return Redirect::guest( 'user/login' );
    } else {
        // now check permissions for the given route
        $user = Sentry::getUser();
        if ( ! $user->hasAccess( Route::currentRouteName() ) )
        {
            // redirect to 403 page
            return Response::make( 'Forbidden', 403 );
        }
    }
});

// Protected routes
Route::group( array( 'before' => 'sentryAuth', function()
{
    Route::get( 'admin', function() { return View::make( 'admin.index' ); } );
});

在您的登录功能中:

public function login() {
    try {
        $creds = array(
            'email'    => Input::get( 'email' ),
            'password' => Input::get( 'password' )
        );
        $user = Sentry::authenticate( $creds );
        return Redirect::intended( 'dashboard' );
    } catch ( Exception $e ) {
        // handle exceptions
    }
}
武卓
2023-03-14

我不确定这一点,因为我没有在我目前的项目中使用哨兵。

似乎由于您在laravel 4中使用了SentryAuth而不是本机Auth类,因此没有设置预期url的会话项。我看了重定向类上的API,我看到了这个:

public function intended($default, $status = 302, $headers = array(), $secure = null)
{
    $path = $this->session->get('url.intended', $default);

    $this->session->forget('url.intended');

    return $this->to($path, $status, $headers, $secure);
}

正如代码所说,会话密钥是“url”。“有意的”。我使用本机身份验证过滤器验证了这一点,并按照预期在Session::get('URL.designed')上设置了预期的URL。。

所以一个可能的解决方案是在会话中手动设置它。一个例子是:

在你的过滤器上

Route::filter('sentryAuth', function () {

    if (!Sentry::check()) {
        Session::put('loginRedirect', Request::url());
        return Redirect::route('login');
    } 
});

在postAuthenticate()方法上

if (!Sentry::check()) {
    return Redirect::to('user/login');
} else {
    // Get the page we were before
    $redirect = Session::get('loginRedirect', 'dashboard');

    // Unset the page we were before from the session
    Session::forget('loginRedirect');

    return Redirect::to($redirect);
}

部分代码取自此处以供参考^_^

上官华池
2023-03-14

在你的过滤器里。php请确保使用:

 return Redirect::guest('login');

而不是

 return Redirect::route('login');

guest函数将为expected()设置正确的会话变量以使其正常工作。

 类似资料:
  • 我的Redis Sentinel故障转移不起作用,当master完成时,不进行握手,故障转移也不发生;然而,sentinel会显示主程序何时恢复到正常状态或何时关闭。我的sentinel.conf文件内容如下: 我真的很感激你能帮上忙。

  • 我正在与一个远程合作伙伴开发一个Laravel项目。 我没有安装mcrypt,所以每次需要使用composer时,我都会通过别名引用php: 这是一个很好的修复,直到我的远程朋友安装了哨兵软件包,这是我无法做到的。 使用另一个stackoverflow线程,我能够使用mcrpyt引用正确版本的php,更新composer并安装sentry。 我的问题是: Sentry在我搭档的本地主机上工作,我将

  • 我正试图使用两个redis节点设置哨兵。请找到内联的conf文件。 端口16371 dir“C:\程序文件\redis\16371\” loglevel通知 日志文件“C:\Program Files\redis\logs\16371.log” 哨兵监视器示例127.0.0.1 6371 *致命配置文件错误*读取配置文件,在第5行 有人能帮我把这个修好吗。蒂亚:)

  • 主要内容:一、哨兵,二、源码分析,三、总结一、哨兵 Sentinel(哨兵),听名字大家都应该想得到这个家伙是做什么的。在redis的应用中,有单机模式、主从模式、哨兵模式和集群模式,其实你从它的发展就可以看出来,redis是从一个简单的应用开始,不断的壮大,从单点到分布式,从简单的主从备份以及初始的哨兵监控,再到可以看成把二者合成的集群模式,除了是应用场景的变化,更多的是为了提高安全性和高可用性。网上有很多人问哨兵和集群有啥不一样,其实

  • 每一个哨兵都可以连接到我的主人,并可以看到奴隶。它们能够独立地检测主从是否倒下。问题是哨兵们无法探测到对方。 我已经验证了每个哨兵都像预期的那样向通道发布消息,但似乎没有一个哨兵真正从其他哨兵通道接收消息。 我怎么让哨兵们见面?

  • Redis 哨兵(Sentinel)是 Redis 的高可用性(Hight Availability)解决方案:由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器,以及这些主服务器的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。 Sentinel