Laravel 4:当公用文件夹是子域时,身份验证不起作用

时间:2013-07-10 15:08:06

标签: php authentication laravel laravel-4

我正在进行此修改以澄清事情,如果您需要更多信息,请阅读编辑下方的内容。

基本上我已经将我的laravel cms部署到站点的子目录中,以便通常的laravel'public'文件夹现在是example.com/blog

当我将它部署到root(即example.com)时,应用程序正常工作,但是当我将其部署到子目录/子文件夹时(请参阅下面的路径等)。博客文章在主/博客索引页面上显示正常,所以它似乎不是路径的问题(虽然我可能是错的)

问题:我无法登录我的cms后端,因为身份验证失败。

我刚刚通过更改登录控制器来测试这个:

public function user()
{
            $username = Input::get('username');
            $password = Input::get('password');

    if(Auth::attempt(array('username' => $username, 'password' => $password)))
    {
        // we are now logged in go here
        return Redirect::to('test');
    }
    else
    {
        return Redirect::to('wrongdetails');
    }
}

和我的路线:

Route::get('test', function()
{
    if (Auth::check())
    {
        return 'the user is logged in';
    }else
    {
        return 'the user is not logged in';
    }
});

Route::get('wrongdetails', function()
{
    return 'wrong password';
});

结果:如果我将正确的详细信息提交到我的登录表单,它会指示我/测试并告诉我用户已登录并且如果我提交错误细节它带我到错误的详细信息页面。有什么想法吗?



我已经构建了一个自定义cms - 当'public'文件夹位于我的域的根目录,即共享主机的public_html时,登录到后端的工作非常有效。

但是对于最近的一个项目,我不得不使用子文件夹'/ blog'作为我的root'public'文件夹,现在它没有正确验证。

让我离题 - 应用程序的工作原理如下:

您可以登录www.example.com/blog/secure/login登录,该站点位于example.com/blog/cms

后面的后端。

只有经过身份验证后才能访问example.com/blog/cms。如果未经过身份验证,则会通过filter.php重定向到登录页面

我的route.php的相关部分如下所示:

Route::group(array('before' => 'auth'), function()
{
    Route::resource('cms', 'PostsController');
});

Route::get('secure/login', function()
{
    return View::make('secure/loginForm');
});

Route::post('secure/login', 'UserLogin@user');

和我的loginForm视图相关如下:

<?php echo Form::open(array('url' => '/secure/login', 'class' => 'box login')); ?>
<fieldset class="boxBody">
 <label>Username</label>
 <input type="text" tabindex="1" name="username" required>
 <label>Password</label>
 <input type="password" name="password" tabindex="2" required>
 <input type="submit" class="btnLogin" value="Login" tabindex="4">
</fieldset>
</form>

最后我的控制器看起来像这样:

public function user()
{
    // get POST data
    $userdata = array(
        'username' => Input::get('username'),
        'password' => Input::get('password')
    );

    if(Auth::attempt($userdata))
    {
        // we are now logged in, go to admin
        return Redirect::to('/cms');
    }
    else
    {
        return Redirect::to('secure/login');
    }
}

它的工作原理是,它通过控制器中的if语句转到/ cms,但当它到达/ cms时,它被重定向到登录页面,因为它不会将我视为已通过身份验证。

任何人都可以看到为什么身份验证不会被遗留的原因?正如我所说,如果公用文件夹是域的根目录但不在子文件夹中,则它可以正常工作。

这可能会有所帮助 - filters.php的相关部分如下所示:

Route::filter('auth', function()
{
    if (Auth::guest()) 
    return Redirect::to('secure/login');
});

我知道它在控制器中传递'if'语句,因为如果我将我的过滤器更改为Redirect :: to('http://google.com');它重定向到谷歌。这意味着登录工作,然后传递给/ cms,但/ cms目录选择未经过身份验证并将我发送到Google.com,如果这是有道理的。

我的路径已更改为让cms指向子域,这是我的bootstrap / paths.php的相关部分:

'app' => __DIR__.'/../../mycms/app',
'public' => __DIR__,
'base' => __DIR__.'/../../mycms',
'storage' => __DIR__.'/../../mycms/app/storage',

还有我的/ blog子目录中的index.php:

require __DIR__.'/../../mycms/bootstrap/autoload.php';
$app = require_once __DIR__.'/../../mycms/bootstrap/start.php';

这绝对是我的头脑,哈哈。

0 个答案:

没有答案