创建laravel ACL部分

时间:2014-11-11 08:35:45

标签: laravel laravel-4 acl

我正忙着创建一个超级管理员可以说出哪些用户可以访问特定区域的部分。 我遇到的问题是如果用户无法访问它,则链接将不在那里。

例如:我有一个超级管理员用户,该用户可以访问所有内容。因此,创建了一个新用户,并且该用户被称为普通用户,普通用户只能访问可用且只能编辑的组列表,但他不能删除或添加新组。

因此,对于这个例子,我需要删除并添加组链接不在那里。

我得到了相当多的代码,所以我只提出了我认为相关的内容。 如果您还有其他任何想要我提出的建议,请告诉我。

这是我的routes.php

Route::group(["before" => "guest"], function () {
$resources = Resource::where("secure", "=", false)->get();

foreach ($resources as $resource) {
  Route::any($resource->pattern, [
    "as"   => $resource->name,
    "uses" => $resource->target
  ]);
}
});

Route::group(["before" => "auth"], function () {
$resources = Resource::where("secure", "=", true)->get();

foreach ($resources as $resource) {
  Route::any($resource->pattern, [
    "as"   => $resource->name,
    "uses" => $resource->target
  ]);
}
});

这是我的助手

<?php

if (!function_exists("allowed"))
{
function allowed($route)
{
    if (Auth::check())
    {
        foreach (Auth::user()->groups as $group)
        {
            foreach ($group->resources as $resource)
            {
                if ($resource->name == $route)
                {
                    return true;
                }
            }
        }
    }
    return false;
}
}

这是我的过滤器

Route::filter("auth", function () {
if (Auth::guest()) {
return Redirect::route("user/login");
} else {
foreach (Auth::user()->groups as $group) {
  foreach ($group->resources as $resource) {
    $current = Route::currentRouteName();

    if ($resource->name === $current) {
      return;
    }
  }
}

return Redirect::route("user/login");
}
});

Route::filter("auth.basic", function () {
  return Auth::basic();
});

这是我的群组index.blade.php

@extends("layout")
@section("content")
@if(count($groups))
    <table>
        <tr>
            <th>name</th>
            <th>&nbsp;</th>
        </tr>
        @foreach($groups as $group)
            <tr>
                <td>
                    {{ $group->name }}
                </td>
                <td>
                    <a href="{{ URL::route("group/edit") }}?id={{ $group->id }}">edit</a>
                    <a href="{{ URL::route("group/delete") }}?id={{ $group->id }}" class="confirm" data-confirm="Are you sure you want to delete this group?">delete</a>
                </td>
            </tr>
        @endforeach
    </table>
@else
    <p>There are no groups.</p> 
@endif
<a href="{{ URL::route("group/add") }}">add group</a>
@stop
@section("footer")
@parent
<script src="/js/jquery.js"></script>
<script src="/js/layout.js"></script>
@stop   

2 个答案:

答案 0 :(得分:1)

$route帮助器中的allowed参数是Laravel Route实例吗?或者只是当前的URL?

关于后者,您可以在routes.php中执行类似的操作:

if (allowed(Request::url())) {
    Route::group(["before" => "auth"], function () {
    $resources = Resource::where("secure", "=", true)->get();

    foreach ($resources as $resource) {
        Route::any($resource->pattern, [
            "as"   => $resource->name,
            "uses" => $resource->target
        ]);
    }
    });
}

答案 1 :(得分:0)

如果您使用的是Laravel 4.2,请尝试恢复默认过滤器,它应该可以正常工作。

我有同样的问题,&amp;我相信它来自:

Route::filter('auth', function()