2013-08-22 8 views
5

Ziel: zwei Benutzer root und Benutzer. Root kann über die Weboberfläche auf alles zugreifen, aber der Benutzer sollte nur einige Teile der Menüs sehen.OpenWrt: LuCI: wie begrenzten Benutzerzugriff zu implementieren

Eine Option wäre, die Option "sysauth" an jedes Modul zu übergeben. Das ist nicht sehr praktisch, weil der Benutzer jeden Menüeintrag sehen würde und die Anmeldeseite für jedes Menü erhalten würde, das er nicht benutzen darf.

Meine Idee ist herauszufinden, wer angemeldet ist und dann nichts in der Funktion index() jedes eingeschränkten Moduls tun. Bisher konnte ich eine solche Funktion in LuCI API (http://luci.subsignal.org/api/luci/) nicht finden, die einen aktuell angemeldeten Benutzer zurückgeben würde.

Ich weiß, wie Sie zusätzliche Benutzer in OpenWrt/LuCI hinzufügen (https://forum.openwrt.org/viewtopic.php?pid=163013#p163013). Aber es ist nur ein Teil der Lösung.

Irgendeine Idee, wie man mein Ziel erreicht?

Antwort

3

Ich habe am Ende eine Lua-Funktion erstellt wie hier beschrieben: http://lua-users.org/wiki/SaveTableToFile, um nicht benötigte Schlüssel aus der Tabelle zu finden und zu entfernen.

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 

Und dann eingefügt meine Benutzerprüfung und Seite löschen, nachdem in libs/web/luasrc/dispatcher.lua dispatch():

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

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

Das ist, wie ich nicht benötigte Seiten zu entfernen, je nachdem, wer angemeldet ist :

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

Es ist ein bisschen schnell und schmutzig, aber es funktioniert. Bitte beachten Sie, dass der direkte Zugriff durch Manipulation der URL weiterhin möglich ist.

aktualisieren

LuCI2 wird ACL unterstützen und Multi-User-Umgebung: http://git.openwrt.org/?p=project/luci2/ui.git;a%3Dsummary

+0

Dank für Ihre Aktie Lösung. Ich habe eine einfache Frage: Ich weiß nicht, die remove_idx in welche Datei schreiben? fügen Sie "user check" nach der Funktion dispatch() oder im Versand() 'modifi dispatch()' hinzu. und wo verwende ich "nicht benötigte Seiten entfernen" -Code? Ich bin verwirrt. Entschuldigung für mein schlechtes Englisch. – omid

+0

Ich habe 'remove_idx' Funktion und Benutzerprüfung hinzugefügt, aber nur Element im Menü löschen erste Seite rendern, wenn neu laden oder auf andere Seite gehen,' LEDs' und 'Pakete' gehen zurück und im Menü verfügbar. kann ich schlecht verwenden Benutzercode überprüfen, können Sie mir bitte helfen? – omid

+0

Sowohl 'remove_idx()' als auch die Authentifizierungsüberprüfung müssen sich in der Datei 'libs/web/luasrc/dispatcher.lua' befinden, da die gesamte Indexstruktur erstellt wird, sobald Sie die Router-Webschnittstelle öffnen. Die Überprüfung der Benutzerauthentifizierung muss in der 'dispatch()' Routine erfolgen, direkt nach dem Code, den ich in meiner Antwort gezeigt habe. Dies ist die Routine, bei der der Indexbaum gefüllt wird. – yegorich