2013-08-22 23 views
5

Hedef: iki kullanıcı kök ve kullanıcı. Kök, web-arayüzü üzerinden her şeye erişebilir, ancak kullanıcı menülerin sadece bazı bölümlerini görmelidir.OpenWrt: LuCI: sınırlı kullanıcı erişiminin nasıl uygulanacağı

Bir seçenek, söz konusu her bir modüle "sysauth" seçeneğini iletmek olacaktır. Bu çok pratik değil çünkü kullanıcı her menü girişini görecek ve izin verilmeyen her menü için giriş sayfası alacaktır.

Fikrim, kimin oturum açtığını belirlemek ve sonra kısıtlanmış her modülün index() işlevinde hiçbir şey yapmamaktır. Şimdiye kadar mevcut bir kullanıcısı olan LuCI API'sinde (http://luci.subsignal.org/api/luci/) böyle bir işlev bulamadı.

OpenWrt/LuCI'ye (https://forum.openwrt.org/viewtopic.php?pid=163013#p163013) nasıl ek kullanıcı ekleyebileceğimi biliyorum. Ama çözümün sadece bir parçası.

Hedeflerime nasıl ulaşılır?

cevap

3

Tablodaki gereksiz anahtarları bulmak ve kaldırmak için burada anlatıldığı gibi bir Lua işlevi oluşturmayı bitirdim: http://lua-users.org/wiki/SaveTableToFile.

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 

Ve sonra benim Kullanıcının onay ve sayfa kütüphanelerini de sonra silmek takılı/web/luasrc/dispatcher.lua sevk():

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

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

ben kaydedilir kim bağlı gereksiz sayfaları kaldırmak nasıl :

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

Bu biraz hızlı ve kirli, ama çalışıyor. Lütfen URL'yi yönlendiren numaralı direkt erişimin hala mümkün olduğunu unutmayın.

Güncelleme

LuCI2 ACL desteği und çok kullanıcılı bir ortam sağlayacaktır: payı çözüm için http://git.openwrt.org/?p=project/luci2/ui.git;a%3Dsummary

+0

sayesinde. Basit bir sorum var: remove_idx dosyasının hangi dosyaya yazıldığını bilmiyor muyum? , "user check" öğesini dispatch() işlevinden sonra veya dispatch() 'modifi gönderim()' de ekleyin. ve "gereksiz sayfaları kaldır" kodunu kullanıyorum? Kafam karıştı. Kötü ingilizcem için üzgünüm. – omid

+0

'remove_idx' işlevini ve kullanıcı denetimini ekledim, ancak yalnızca sayfa ilk sayfasındaki öğeyi kaldır, eğer yeniden yüklüyse ya da başka bir sayfaya giderse,' led'ler 've 'paketler' geri dönüp menüde kullanılabilir. kötü kullanım kullanıcı kodunu kontrol edebilir miyim, lütfen bana yardımcı olabilir misiniz? – omid

+0

Hem 'remove_idx()' hem de kimlik doğrulama kontrolü libs/web/luasrc/dispatcher.lua' dosyasında olmalıdır, çünkü tüm dizin ağacı yönlendirici web arabirimini açar açmaz oluşturulmuştur. Kullanıcı doğrulama kontrolü, cevabımda gösterdiğim kodun hemen ardından 'dispatch()' rutininde olmalıdır. Bu, dizin ağacının doldurulacağı rutin. – yegorich

İlgili konular