今天我想使用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的所有操作,以及所有其他控制器是否公开?
谢谢。
答案 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.}
它对我有用。