2013-08-22 34 views
5

Mục tiêu: hai người dùng root và người dùng. Root có thể truy cập mọi thứ thông qua giao diện web nhưng người dùng sẽ chỉ thấy một số phần của menu.OpenWrt: LuCI: cách triển khai quyền truy cập người dùng bị giới hạn

Một tùy chọn sẽ là chuyển tùy chọn "sysauth" cho mọi mô-đun được đề cập. Điều đó không thực tế lắm, bởi vì người dùng sẽ thấy mọi mục nhập trình đơn và sẽ nhận được trang đăng nhập cho mọi menu mà anh ta không được phép.

Ý tưởng của tôi là tìm hiểu xem ai đã đăng nhập và sau đó không làm gì trong hàm index() của từng mô-đun bị hạn chế. Cho đến nay tôi không thể tìm thấy một chức năng như vậy trong LuCI API (http://luci.subsignal.org/api/luci/), điều đó sẽ trả về một người dùng đã đăng nhập hiện tại.

Tôi biết cách thêm người dùng bổ sung trong OpenWrt/LuCI (https://forum.openwrt.org/viewtopic.php?pid=163013#p163013). Nhưng nó chỉ là một phần của giải pháp.

Bất kỳ ý tưởng nào, cách đạt được mục tiêu của tôi?

Trả lời

3

Tôi đã kết thúc tạo hàm Lua như được mô tả ở đây: http://lua-users.org/wiki/SaveTableToFile, để tìm và xóa các khóa không cần thiết khỏi bảng.

function remove_idx( tbl, index) 

    -- initiate variables for save procedure 
    local tables,lookup = { tbl },{ [tbl] = 1 } 

    for idx,t in ipairs(tables) do 
     local thandled = {} 

     for i,v in ipairs(t) do 
    thandled[i] = true 
    local stype = type(v) 
    -- only handle value 
    if stype == "table" then 
     if not lookup[v] then 
      table.insert(tables, v) 
      lookup[v] = #tables 
     end 
    else 
     if i == index then 
      t[i] = nil 
      return 
     end 
    end 
     end 

     for i,v in pairs(t) do 
    -- escape handled values 
    if (not thandled[i]) then 

     local flag = 0 
     local stype = type(i) 
     -- handle index 
     if stype == "table" then 
      if not lookup[i] then 
      table.insert(tables,i) 
      lookup[i] = #tables 
      end 
     else 
      flag = 1 
      if i == index then 
      t[i] = nil 
      return 
      end 
     end 

     if flag == 1 then 
      stype = type(v) 
      -- handle value 
      if stype == "table" then 
      if not lookup[v] then 
      table.insert(tables,v) 
      lookup[v] = #tables 
      end 
      else 
      if i == index then 
      t[i] = nil 
      return 
      end 
      end 
     end 

    end 
     end 
    end 
end 

Và sau đó chèn kiểm tra người sử dụng và trang của tôi xóa sau trong libs/web/luasrc/dispatcher.lua công văn():

if c and c.index then 
    local tpl = require "luci.template" 

    if util.copcall(tpl.render, "indexer", {}) then 
     return true 
    end 
end 

Đó là cách tôi loại bỏ các trang không cần thiết tùy thuộc vào người được đăng nhập :

if ctx.authuser == "user" then 
      remove_idx(ctx.tree, "packages") 
      remove_idx(ctx.tree, "leds") 
    end 

Đó là một chút nhanh chóng và bẩn, nhưng nó hoạt động. Xin lưu ý rằng bạn có thể truy cập trực tiếp bằng cách thao tác URL.

Cập nhật

LuCI2 sẽ cung cấp ACL môi trường hỗ trợ und đa người dùng: http://git.openwrt.org/?p=project/luci2/ui.git;a%3Dsummary

+0

nhờ để chia sẻ giải pháp của bạn. tôi có một câu hỏi đơn giản: tôi không biết remove_idx ghi vào tập tin nào? thêm "người dùng kiểm tra" sau khi dispatch() chức năng hoặc trong dispatch() 'modifi dispatch()'. và tôi sử dụng mã "loại bỏ các trang không cần thiết" ở đâu? Tôi đang bối rối. Xin lỗi vì tiếng Anh của tôi không tốt. – omid

+0

tôi đã thêm chức năng 'remove_idx' và kiểm tra người dùng, nhưng chỉ xóa mục trong menu trang đầu tiên hiển thị, nếu tải lại hoặc chuyển đến trang khác, mục' leds' và 'packages' quay lại và có sẵn trong menu. có thể là tôi sử dụng kiểm tra mã người dùng xấu, bạn có thể giúp tôi được không? – omid

+0

Cả 'remove_idx()' và kiểm tra xác thực phải nằm trong tệp 'libs/web/luasrc/dispatcher.lua', vì toàn bộ cây chỉ mục được xây dựng ngay sau khi bạn mở giao diện web của bộ định tuyến. Kiểm tra xác thực người dùng phải ở trong 'dispatch()' routine, ngay sau mã tôi đã đưa ra trong câu trả lời của mình. Đây là thói quen, nơi cây chỉ mục sẽ được lấp đầy. – yegorich

Các vấn đề liên quan