Mặc định tài nguyên vai trò ACL


8

Giả sử chúng ta thêm một số tài nguyên mới vào ACL như vậy:

<acl>
    <resources>
        <admin>
            <children>
                <catalog>
                    <children>
                        <search>
                            <children>
                                <import translate="title">
                                    <title>Import</title>
                                </import>
                                <export translate="title">
                                    <title>Export</title>
                                </export>
                            </children>
                        </search>
                    </children>
                </catalog>
            </children>
        </admin>
    </resources>
</acl>

Sau đó, chúng tôi thêm phần sau đây vào một nút xuất hiện trong lưới SearchTerm:

if (Mage::getSingleton('admin/session')->isAllowed('catalog/search/import')) {
    $this->_addButton('import', array(
        'label'   => 'Import Search Terms',
        'onclick' => "setLocation('".$this->getUrl('*/*/import')."')"
    ));
}

Nếu sau đó tôi đăng nhập với tư cách là người dùng không phải quản trị viên, tôi thực sự đã nghĩ rằng hành vi dự kiến ​​sẽ không có nút nào hiển thị, vì tôi rõ ràng không cung cấp cho người dùng vai trò tài nguyên. Mặc dù hóa ra, giá trị trả về mặc định isAlloweddường như là đúng. Đối với các vấn đề phức tạp, khi bạn đi và xem các tài nguyên cho vai trò đó, hộp kiểm sẽ không xuất hiện.

Tôi có thể giải quyết 'vấn đề' bằng cách nhấp qua từng vai trò và nhấp vào lưu, nhưng đây là Pita để thực hiện đặc biệt trên các môi trường trực tiếp / giai đoạn / nhà phát triển. Có cách nào dễ dàng để tự động từ chối tài nguyên này từ mỗi vai trò thông qua mã không? Tôi không phiền khi thêm một tập lệnh di chuyển nếu cần. Tôi đã có một cái nhìn nhanh chóng về những gì xảy ra trong cùng một hành động. Có lẽ, tôi có thể làm điều này bằng cách tải tất cả các vai trò, lặp qua chúng và thực hiện logic tương tự để Mage_Admin_Model_Resource_Rules::saveRelchèn các hàng vào bảng. Nhưng mã này dường như giả định rằng tất cả các tài nguyên được đăng, điều đó có nghĩa là để gọi nó trực tiếp, tôi cần tìm ra định dạng nào tôi cần để truyền dữ liệu vào và có thể tải tài nguyên hiện có.


Không chắc chắn bạn đang sử dụng 'is ALLowed' một cách chính xác - không nên như vậy sao? $session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())
Benubird

Có vẻ như là một lỗi với tôi
Fabian Blechschmidt

Câu trả lời:


2

Tôi đã không thể tạo lại vấn đề trên 1.13.1.0. Tôi đã sử dụng mã chính xác của bạn ngoại trừ tôi đã sử dụng nó để thay đổi tiêu đề của trang một cách có điều kiện. Lần đầu tiên tôi đã thử nghiệm điều này với một người dùng đã đăng nhập bằng tất cả các quyền và phương thức is ALLowed trả về đúng. Sau đó, tôi đã tạo một vai trò khác không có hộp kiểm này được chọn nhưng có tất cả các hộp khác được chọn và sau đó tôi đã đăng xuất và đăng nhập lại với một người dùng được gắn với vai trò mới này và isowowed đã trả về sai. Bạn có thể thử đăng xuất và đăng nhập lại. Nếu điều này vẫn không hoạt động, hãy thử xóa bộ nhớ cache và phiên của bạn và đăng nhập lại.


0

Giá trị mặc định trong Mage_Admin_Model_Sessionthực tế false(sẽ không có ý nghĩa khác):

public function isAllowed($resource, $privilege = null)
{
    $user = $this->getUser();
    $acl = $this->getAcl();

    if ($user && $acl) {
        if (!preg_match('/^admin/', $resource)) {
            $resource = 'admin/' . $resource;
        }

        try {
            return $acl->isAllowed($user->getAclRole(), $resource, $privilege);
        } catch (Exception $e) {
            try {
                if (!$acl->has($resource)) {
                    return $acl->isAllowed($user->getAclRole(), null, $privilege);
                }
            } catch (Exception $e) { }
        }
    }
    return false;
}

Nhưng điều có thể xảy ra là, các vai trò đã được đặt quyền catalog, tức là bạn không chọn tất cả các con riêng lẻ mà chính hộp kiểm danh mục. Sau đó, nó được lưu dưới dạng một quyền cho tất cả trẻ em ( catalog/*), ngay cả khi chúng được thêm vào sau này.

Xin lỗi, điều đó không đúng. Mỗi quyền được lưu riêng bổ sung cho phụ huynh.


Đâu là logic cho phép một quyền cho tất cả trẻ em?
Peter O'Callaghan

Tôi đã kiểm tra lại và không thể tìm thấy nó, có vẻ như tài nguyên gốc này chỉ tồn tại để bạn có thể kiểm tra isAllowed('catalog')- nó không cho phép truy cập vào tất cả trẻ em. Xin lỗi vì thông tin sai lệch!
Fabian Schmengler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.