2013-08-22 9 views
5

Obiettivo: due utenti root e utente. Root può accedere a tutto tramite l'interfaccia web, ma l'utente dovrebbe vedere solo alcune parti dei menu.OpenWrt: LuCI: come implementare l'accesso utente limitato

Un'opzione sarebbe quella di passare l'opzione "sysauth" a ogni modulo in questione. Questo non è molto pratico, perché l'utente vedrebbe ogni voce di menu e otterrebbe la pagina di accesso per ogni menu a cui non è permesso.

La mia idea è di capire chi è connesso e quindi non fare nulla nella funzione index() di ogni modulo limitato. Finora non sono riuscito a trovare una tale funzione nell'API di LuCI (http://luci.subsignal.org/api/luci/), che restituirebbe un utente registrato corrente.

So come aggiungere altri utenti in OpenWrt/LuCI (https://forum.openwrt.org/viewtopic.php?pid=163013#p163013). Ma è solo una parte della soluzione.

Qualche idea, come raggiungere il mio obiettivo?

risposta

3

Ho finito per creare una funzione Lua come descritto qui: http://lua-users.org/wiki/SaveTableToFile, per trovare e rimuovere le chiavi non necessarie dalla tabella.

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 

E poi inserito il mio check-utente e pagina di eliminazione dopo in libs/web/luasrc/dispatcher.lua spedizione():

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

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

Ecco come ho rimuovere le pagine non necessarie a seconda di chi viene registrato in :

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

È un po 'veloce e sporco, ma funziona. Si noti che l'accesso diretto tramite manipolando l'URL è ancora possibile.

Aggiornamento

LuCI2 fornirà ACL ambiente di supporto und multiutente: http://git.openwrt.org/?p=project/luci2/ui.git;a%3Dsummary

+0

grazie per la condivisione la vostra soluzione. Ho una semplice domanda: non conosco la scrittura remove_idx su quale file? aggiungi "controllo utente" dopo la funzione dispatch() o in dispatch() 'modifi dispatch()'. e dove uso il codice "rimuovi le pagine non necessarie"? Sono confuso. scusa per il mio cattivo inglese. – omid

+0

ho aggiunto la funzione 'remove_idx' e il controllo utente, ma rimuovo solo l'elemento nel rendering della prima pagina del menu, se si ricarica o si passa ad un'altra pagina, la voce' leds' e 'packages' torna indietro e disponibile nel menu. potrebbe essere un cattivo uso controllare il codice utente, puoi aiutarmi per favore? – omid

+0

Sia 'remove_idx()' che il controllo di autenticazione deve essere nel file 'libs/web/luasrc/dispatcher.lua', perché l'intero albero dell'indice viene creato non appena si apre l'interfaccia web dei router. Il controllo dell'autenticazione utente deve essere nella routine 'dispatch()', subito dopo il codice che ho mostrato nella mia risposta. Questa è la routine, in cui verrà riempito l'albero dell'indice. – yegorich

Problemi correlati