草庐IT

php - 拉维尔 5 : Restrict access to controllers by User group

coder 2024-04-14 原文

我已经开始学习 Laravel 5.1,到目前为止我很喜欢它!但有一件事我还不明白……
在我之前的项目中,我有 2 个特定的 Controller (例如:“normal”、“extended”),在成功登录后,根据数据库中的用户 user_group 调用它们。

如果“Foo.Bar”输入了他的有效凭据并拥有 normal 组,他将被重定向到 NormalControler。因为我没有使用任何框架,所以我通过为该组设置一个 $_SESSION 并检查它来限制对另一个组的访问。因此,如果另一个组试图访问该 Controller ,他就会被重定向。

这在 Laravel 5 中如何实现?到目前为止,我有一个无需身份验证即可调用的 Controller ,并且受 routes.php 中的此代码限制:

// All routes in the group are protected, only authed user are allowed to access them
Route::group(array('before' => 'auth'), function() {

    // TO-DO : Seperate Controller access
});

登录看起来像这样:

public function performLogin()
    {   

        $logindata = array(
            'username' => Input::get('user_name'),
            'password' => Input::get('user_pass')
        );

        if( Auth::attempt( $logindata ) ){
            // return \Redirect::to( check group and access this controller based on it);
        }
        else {
           // TO-DO : Redirect back and show error message
           dd('Login failed!');
        }
    }

----- 编辑 -----

我已经运行了 artisan 命令并按照您的建议制作了这个中间件:

namespace App\Http\Middleware;

use Closure;
use Request;

class GroupPermissions
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, $group)
    {
        // Check User Group Permissions
        if( $request->user()->group === $group ){
            // Continue the request
            return $next($request);
        }

        // Redirect
        return redirect('restricted');
    }
}

并将这一行编辑到 Kernel.php$routeMiddleware 中:

'group.perm' => \App\Http\Middleware\GroupPermissions::class

我认为到目前为止这是正确的,如果我错了请纠正我!然后我可以做这样的事情来限制 Controller 吗?

Route::group(array('before' => 'auth'), function() {

    Route::group( ['middleware' => 'group.perm', 'group' => 'normal'], function(){
        Route::get('/normal/index', 'DummyNormalController@index');
    });

    Route::group( ['middleware' => 'group.perm', 'group' => 'extended'], function(){
        Route::get('/extended/index', 'DummyExtendedController@index');
    });

});

最佳答案

好的,这是您可以做的。一旦用户登录,您将检查他的凭据,获取他的 user_group 并决定他应该被重定向到哪个 Controller 。

if( Auth::attempt( $logindata ) ){
    $user = Auth::user();

    if ($user->inGroup('normal')) {
         return redirect()->route('normal_controllers_named_route');
    }
    return redirect()->route('extended_controllers_named_route');
}

return redirect()->back()->withFlashMessage('don\'t get me wrong');

这将在登录后处理正确的路由。

下一部分,您需要保护您的路由免受不需要的用户组的影响,这可以通过中间件来实现。

  1. 执行 artisan 命令 php artisan make:middleware ShouldBeInGroup
  2. 转到 app/http/Kernel.php 并将新的中间件添加到 routeMiddleware 数组。该项目的关键可能是任何你喜欢的。让我们调用 inGroup。所以:'inGroup' => 'App\Http\Middleware\ShouldBeInGroup'
  3. 现在,在你的 Controller 中,在构造函数中,你可以调用这个中间件

$this->middleware('inGroup:extended');//我们还传递了组名

  1. 最后,处理我们的中间件。打开新创建的 ShouldBeInGroup 类并编辑 handle 方法。

    public function handle($request, Closure $next, $groupName)
    {
        if (Auth::check() && Auth::user()->inGroup($groupName)) {
             return $next($request);
        }
    
        return redirect('/');
    }
    
  2. 最后您应该处理 inGroup 方法,它应该返回 truefalse。我假设您的用户表中有 user_group 字段。然后在你的 User Eloquent 模型中添加方法

    public function inGroup($groupName) {
        return $this->user_group == $groupName;
    }
    

编辑

如果你想在你的路由中使用这个中间件,你可以这样做

Route::group(array('before' => 'auth'), function() {
    Route::get('/normal/index', ['middleware' => 'group.perm:normal', 'uses' =>'DummyNormalController@index']);
}

但通常最好将所有中间件放入 Controller 的构造函数中

public function __construct(){
    $this->middleware('group.perm:normal'); // you can also pass in second argument to limit the methods this middleware is applied to : ['only' => ['store', 'update']];
}

此外,Laravel 还提供了内置的 auth 中间件,您可以使用它

public function __construct(){
    $this->middleware('auth');
    $this->middleware('group.perm:normal');
}

这样你的路线就会变得更干净,只是:

Route::get('normal/index', 'DummyNormalController@index');

关于php - 拉维尔 5 : Restrict access to controllers by User group,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31447217/

有关php - 拉维尔 5 : Restrict access to controllers by User group的更多相关文章

  1. ruby-on-rails - rails group by 和 order by column - 2

    在我的Controller中,我得到了按类别分组的所有Extras:defindex@categories=Extra.all.group_by(&:category)end结果类似于哈希数组:{#=>[#,#=>[#,#]}我想按类别“排序”列而不是id排序,它应该如下所示:{#=>[#,#=>[#,#]}当我尝试时:defindex@categories=Extra.all.group_by(&:category).sort_by{|s|s[:sort]}end我得到“没有将符号隐式转换为整数”。那是因为我在“sort_by”中使用了一个符号吗? 最佳答

  2. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  3. ruby - 如何将 Thor::Group 注册为带参数的子命令 - 2

    这道题开始于here.但随着我对雷神的了解越来越多,情况发生了很大变化。我正在尝试创建一个带参数的Thor::Group子命令。奇怪的是,如果没有参数,它就可以工作。我可以使用Thor::Group作为子命令吗?这在我输入时有效:foocounterfoo/bin/foomoduleFooclassCLI但是当我输入时这不起作用:foocounter5moduleFooclassCLI','Countupfromtheinput.')endclassCounter:numeric,:desc=>"Thenumbertostartcounting"desc"Prints2numbersb

  4. ruby - 从 Ruby 中的排序数组创建嵌套哈希——递归 group_by - 2

    我有一个对象数组,这些对象已根据这些对象的几个属性进行了排序。按照优先顺序,这些属性是foo、bar和baz。这意味着对象首先按foo排序;然后具有相同foo值的子序列按bar排序;然后具有相同foo和bar值的那些按baz排序。我想将其转换为反射(reflect)该分组的嵌套哈希。基本上我正在寻找递归Enumerable#group_by。键是foo、bar和baz的值;这些值将是对象的子哈希或数组。这是一个例子:[obj1,obj2,...objn].group_by_recursive(:foo,:bar,:baz)#=>{foo_val_1=>{bar_val_1=>{baz_

  5. ruby-on-rails - Rails group_by 是否已弃用? - 2

    我有一个要分组的数组,“group_by”函数似乎适合我的情况。http://apidock.com/rails/Enumerable/group_by我在Rails3.2.13中使用它。grouped_array=my_array.group_by(&:my_function)#Assumerun'my_function'haveresult1onelement1,element3andresult2onelement2,element4,then:#grouped_array={#result1=>[element1,element3],#result2=>[element2,el

  6. ruby-on-rails - Rails 还是 Sinatra? PHP程序员入门学习哪个好? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?

  7. ruby-on-rails - 如何使用 grouped_collection_select 显示多选? - 2

    我正在使用以下代码来显示类别的TreeView选择框:grouped_collection_select(:categories,:category_id,Category.top_level,:children,:name,:id,:name,:include_blank=>true)如何更改它以允许多选?此外,是否可以让它显示复选框而不是选择框? 最佳答案 尝试grouped_collection_select(:categories,:category_id,Category.top_level,:children,:name

  8. ruby-on-rails - ruby group_by 对象? - 2

    我有一个数组或不同的对象,我想按对象分组。例如=>[#,#,#,#]all.size=>4我试过了all.group_by(Object)但这没有用...关于如何对一个数组中的对象进行分组有什么想法吗? 最佳答案 你想做这样的事情吗?all.group_by(&:class)它将数组中的对象按类名分组编辑评论all.group_by(&:class).eachdo|key,group|group.each{|item|putsitem}endKey是分组元素,obj是键的集合,因此这将遍历分组中的每个组并列出该组中的对象您也可以很容

  9. ruby-on-rails - PHP 魔术方法 __call、__get 和 __set 的 Ruby 等价物 - 2

    我很确定Ruby有这些(等同于__call、__get和__set),否则find_by将如何在Rails中工作?也许有人可以举一个简单的例子来说明如何定义与find_by相同的方法?谢谢 最佳答案 简而言之你可以映射__调用带有参数的method_missing调用__设置为方法名称以'='结尾的method_missing调用__获取不带任何参数的method_missing调用__调用PHPclassMethodTest{publicfunction__call($name,$arguments){echo"Callingob

  10. ruby - Lisp - 是否适合网络编程/应用程序(交互式)? ruby 的方式是? php的方式是? - 2

    Lisp是否适合Web编程/应用程序(交互式),就像ruby​​和php一样?需要考虑的事情是:易于使用可部署性难度(尤其是对于编程初学者而言)(编辑)在阅读PaulGraham'sessay之后,我特别提到了CommonLisp.将是我的第一门编程语言。在这方面。这样做合适吗?我听说Clojure的宏功能不如CommonLisp的强大,这就是我尝试学习Clojure的原因。它教授编程并且非常强大。 最佳答案 Lisp是一个语系,而不是单一的语言。为了稍微回答您的问题,是的,存在用于各种Lisp方言的Web框架,例如用于Common

随机推荐