Cakephp3 Auth - 允许一些控制器在没有授权的情况下工作

时间:2015-09-28 07:23:56

标签: cakephp-3.0

今天我想使用Cakephp3 auth组件。

我学习了cakephp3博客教程和授权文档。

我已经关注了Blog教程,现在一切正常,如登录,注销等......

我想让UsersController受到保护,只有在我登录时才会使用。

这没关系,但是现在我看到我需要登录其他控制器操作,例如我有PagesController,它应该是公共的。

我在docs中找到了这个:

function getOpenPurchaseInvoiceItems(id) {
    $(".k-loading-mask").show();
    jQuery.ajax({
        url: '/purchaseinvoices/getopenpurchaseinvoiceitems',
        data: JSON.stringify({ supplierId: id }),
        type: 'POST',
        contentType: "application/json"
    }).done(function (data) { //This done is never called.
        viewmodel.Items = ko.mapping.fromJS(data, {}, viewmodel.Items);
        getPrepaymentableOrders(id);
    });
}

//This one works like a charm when called directly
function getPrepaymentableOrders(id) {
    jQuery.ajax({
        url: '/purchaseinvoices/getprepaymentableorders',
        data: JSON.stringify({ supplierId: id }),
        type: 'POST',
        contentType: "application/json",
    }).done(function (data) {
        viewmodel.PrepaymentableOrders = ko.mapping.fromJS(data, {}, viewmodel.PrepaymentableOrders);
        $("div.k-loading-mask").hide();
    });
}

但是我有很多动作,在这个函数中列出动作可能会有问题。

我的问题是:如何全局设置要保护的UsersController的所有操作,以及所有其他控制器是否公开?

谢谢。

5 个答案:

答案 0 :(得分:6)

对于UsersController

class UsersController extends AppController
{
    public function beforeFilter(Event $event)
    {
        // allow only login, forgotpassword
         $this->Auth->allow(['login', 'forgotpassword']);
    }
}

对于其他控制器。 (例如:PagesController)

class PagesController extends AppController
{
    public function beforeFilter(Event $event)
    {
       // allow all action
        $this->Auth->allow();
    }
}

答案 1 :(得分:2)

在您的appsController中,您可以添加以下代码。您必须在$this->Auth->allow('ViewName')中添加所有视图名称。

public function beforeFilter(Event $event)
{
    parent::beforeFilter($event);
    // Allow users to register and logout.
    // You should not add the "login" action to allow list. Doing so would
    // cause problems with normal functioning of AuthComponent.
    $this->Auth->allow(['Index', 'View', 'Edit', 'CustomViewName']); // NOTE: DO NOT ADD VIEWS THAT ARE USED BY YOUR USERSCONTROLLER.
}

从UsersController,您可以删除$this->Auth->allow(['add', 'logout']);。我就是这样做的。

答案 2 :(得分:1)

我认为您可以使用ControllerAuthorize.It将允许您在控制器回调中处理授权检查。在您的应用程序组件中添加此设置。

$this->loadComponent('Auth', [
            'authorize' => 'Controller',
]);

然后,您可以isAuthorized()

阻止或允许访问

示例:

 public function isAuthorized($user) {
        if ( isset($user['role']) == 'yourRole' ) {
                return TRUE;
        }

        else {
            header("location: Router::url('/', true)");
            exit();
       }
 }

详情 cake doc

答案 3 :(得分:1)

尝试: $this->Auth->deny(['controllers name that you want to authorize']);

答案 4 :(得分:0)

public function beforeFilter(Event $event){
parent::beforeFilter($event);   
$this->Auth->allow(['search']); // NOTE: DO NOT ADD VIEWS THAT ARE USED BY YOUR USERSCONTROLLER.}

它对我有用。