首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Joomla项级ACL问题-权限不能正常工作

Joomla项级ACL问题-权限不能正常工作
EN

Stack Overflow用户
提问于 2014-06-30 15:11:58
回答 1查看 526关注 0票数 0

我遵循了关于如何将ACL添加到我的自定义组件的Joomla Docs教程。虽然我成功地添加了组件范围的权限管理,但我正在努力使项目级别的ACL工作。

我正在尝试为表books实现一个ACL。如本教程所述,我在那里添加了一个asset_id列。我在book.xml中添加了一个文件admin/models/forms/ --内容如下:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<form>
    <field name="asset_id" type="hidden" filter="unset" />
    <field name="rules"
        type="rules"
        label="JFIELD_RULES_LABEL"
        translate_label="false"
        filter="rules"
        validate="rules"
        class="inputbox"
        component="com_mytest"
        section="book"
    />
</form>

这就是我的access.xml的样子:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
<access component="com_mytest">
        <section name="component">
                <action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
                <action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
                <action name="core.edit" title="JACTION_EDIT_BOOK" description="COM_MYTEST_ACCESS_EDIT_BOOK_DESC" />
                <action name="core.delete" title="JACTION_DELETE_BOOK" description="COM_MYTEST_ACCESS_DELETE_BOOK_DESC" />
        </section>
        <section name="book">
                <action name="core.edit" title="JACTION_EDIT_BOOK" description="COM_MYTEST_ACCESS_EDIT_BOOK_DESC" />
                <action name="core.delete" title="JACTION_DELETE_BOOK" description="COM_MYTEST_ACCESS_DELETE_BOOK_DESC" />
        </section>
</access>

在我的JTable变体admin/tables/mytest_books.php中,我添加了以下方法:

代码语言:javascript
复制
public function bind($array, $ignore = '')
{               
    if (isset($array['jform']) && isset($array['jform']['rules']) && is_array($array['jform']['rules']))
    {
        $rules = new JAccessRules($array['jform']['rules']);
        $this->setRules($rules);
    }
    return parent::bind($array, $ignore);
}

protected function _getAssetName()
{
    return 'com_mytest.book.'.(int) $this->id;
}

protected function _getAssetTitle()
{
    return $this->name;
}

protected function _getAssetParentId()
{
    $asset = JTable::getInstance('Asset');
    $asset->loadByName('com_mytest');
    return $asset->id;
}

正如您可能注意到的,在上面的bind()方法中,我必须从rules数组中提取jform数组。在我看到的所有教程中,它们只是引用$array['rules']而不是$array['jform']['rules']

,也许这就是我的问题?

这是我的书“模型admin/models/book.php

代码语言:javascript
复制
public function getForm($data = array(), $loadData = true)
{
    $form = $this->loadForm('com_mytest.book', 'book', array('control' => 'jform', 'load_data' => $loadData));          
    if (empty($form)){
        return false;
    }           
    return $form;
}

protected function loadFormData()
{
    $data = JFactory::getApplication()->getUserState('com_mytest.edit.book.data', array());
    if (empty($data))
    {
        $data = $this->getItem($this->_id);
    }
    return $data;           
}

下面是我在图书编辑屏幕admin/views/book/tmpl/default.php底部添加的内容

代码语言:javascript
复制
<?php echo JHtml::_('sliders.start', 'permissions-sliders-'.$this->row->id, array('useCookie'=>1)); ?>
            <?php echo JHtml::_('sliders.panel', JText::_('COM_MYTEST_FIELDSET_RULES'), 'access-rules'); ?>
            <fieldset class="panelform">
                <?php echo $this->form->getLabel('rules'); ?>
                <?php echo $this->form->getInput('rules'); ?>
            </fieldset>
            <?php echo JHtml::_('sliders.end'); ?>

,以下是起作用的东西:

编辑完组的书级ACL后,当我保存一本书时,设置将正确保存。我的资产表看起来不错,显示的条目如下:

id _ {“1”:0,"6":1,"7":1,"2":0,"3":0,"4":1,"5":0,"10":0,"12":0,"8":0},"core.delete":{"1":0,"6":1,"7":0,“2”"3":0,"4":0,"5":0,"10":0,"12":0,“8”:0}

是的,ID 2的书在asset_id列中有198。

这里是我的问题

当我通过为管理员用户组设置“允许的所有操作”来保存图书ACL时,对话框将显示权限旁边的冲突。将所有设置为“拒绝”不会显示此消息。

For case(和)

当我使用第二个浏览器作为管理员用户组用户登录时,此条件总是返回false (是的,$row->id确实包含有效的ID):

$canEdit =JFactory::getUser()->authorise(‘core.dit’,'com_mytest.book.'.$row->id);

你能帮我解决这个难题吗?

,非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2014-07-08 01:55:56

您的图书资产是否在资产表中获得正确的父id?任何时候,当你使用ACL时,当你不使用类别时,你需要非常小心地对待养育。通常,您希望确保这些项将组件作为父级。这在类中有点混乱,但是您可以查看com_modules,看看它如何工作。当组在项和分支的开始之间有一个很难拒绝的位置时,就会出现冲突情况。通常,这在组件上可能被拒绝,但作为一个例子,允许该组件的类别。如果你的养育方式做得不正确,你就会陷入冲突的境地。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24493346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档