【问题标题】:Laravel automatic logout issue with filterLaravel 过滤器自动注销问题
【发布时间】:2025-12-29 13:15:06
【问题描述】:

我需要一些过滤器来将用户重定向到特定的控制面板,比如管理员会去他的管理面板,作家会去他的作家区域..所以我定义了一些过滤器 如果没有这些过滤器,用户不会自动注销,但是当使用这些过滤器时,用户会自动注销,甚至导航一页到第二页用户自动注销。

我的代码有什么问题吗?

代码如下:

路线

Route::filter('allow_only_admin', function()    {
    if (Session::get('role') !== "admin" ){
        if (Session::get('role') == 'writer') {
            return Redirect::route('windex');
        }
    }   });

Route::filter('allow_only_writer', function()
{
    if (Session::get('role') !== "writer" ){
        if (Session::get('role') == 'admin') {
            return Redirect::route('orders.all');
        }
    }
});
Route::group(['prefix' => 'writer','before'=>'allow_only_writer'], function()
{
    Route::get('index', ['as' => 'windex', 'uses'   => 'Writer@showIndex']);
});

【问题讨论】:

  • 您是否将用户角色存储在数据库中?我的意思是用户角色可以通过用户模型访问
  • 角色未在用户表中定义...我正在使用github.com/romanbican/roles 作为角色

标签: laravel laravel-5 laravel-filters


【解决方案1】:

尝试这样的事情我没有测试这段代码

Route::filter('no_auth', function(){
        if(Auth::check()){
            if(!Auth::user()->is('admin')){
                return Redirect::route('routename');
            }

            if(!Auth::user()->is('writer')){
                return Redirect::route('routename');
            }

        }
    });

【讨论】:

    【解决方案2】:

    这样试试

    Route::filter('allow_only_admin', function(){
        if (Auth::check() && Auth::user()->role !== "admin" && Auth::user()->role == 'writer' ){
                return Redirect::route('windex');
        }
        return Redirect::route('home or somewhere');
    });
    
    Route::filter('allow_only_writer', function(){
        if (Auth::check() && Auth::user()->role !== "writer" &&  Auth::user()->role == 'admin'){
                return Redirect::route('orders.all');
        }
        return Redirect::route('home or somewhere');
    });
    

    注意:如果用户不能拥有多个角色,那么您不想同时检查Auth::user()->role !== "admin" && Auth::user()->role == 'writer' 一个就够了

    Auth::user()->role == 'writer'
    

    【讨论】:

    • 您正在访问对象Auth::user() 上的属性role,该对象可能未实例化(未登录)。这可能会导致错误。如果您可以使用Auth::check()Auth::user()
    • @Luceos 现在可以了吗?我想你的意思是这个
    • @tehc-sira 这在我的情况下不起作用我的用户表中没有任何角色属性我使用 github.com/romanbican/roles 作为角色并且有一个检查功能admin 并像这样返回真假 Auth::user()->is('admin');