2013-08-22 24 views
5

Cel: dwóch użytkowników root i użytkownik. Root może uzyskać dostęp do wszystkiego za pośrednictwem interfejsu internetowego, ale użytkownik powinien widzieć tylko niektóre części menu.OpenWrt: LuCI: jak wdrożyć ograniczony dostęp użytkownika

Jedną opcją byłoby przekazanie opcji "sysauth" do każdego modułu, o którym mowa. Nie jest to zbyt praktyczne, ponieważ użytkownik zobaczy wszystkie pozycje menu i otrzyma stronę logowania dla każdego menu, do którego nie ma dostępu.

Mój pomysł polega na tym, aby dowiedzieć się, kto jest zalogowany, a następnie nic nie robić w funkcji index() każdego ograniczonego modułu. Do tej pory nie mogłem znaleźć takiej funkcji w LuCI API (http://luci.subsignal.org/api/luci/), która zwróciłaby bieżącego zalogowanego użytkownika.

Wiem, jak dodać dodatkowych użytkowników w OpenWrt/LuCI (https://forum.openwrt.org/viewtopic.php?pid=163013#p163013). Ale to tylko część rozwiązania.

Każdy pomysł, jak osiągnąć mój cel?

Odpowiedz

3

Skończyłem na tworzeniu funkcji Lua, jak opisano tutaj: http://lua-users.org/wiki/SaveTableToFile, aby znaleźć i usunąć niepotrzebne klucze ze stołu.

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 

A potem dodaje mój czek użytkownika i po stronie usuwać w 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 

To jak usunąć niepotrzebne strony, w zależności od tego, kto jest zalogowany :

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

Jest trochę szybki i brudny, ale działa. Pamiętaj, że bezpośredni dostęp przez manipulowanie URL jest nadal możliwe.

Aktualizacja

LuCI2 zapewni wsparcie und ACL środowisko dla wielu użytkowników: http://git.openwrt.org/?p=project/luci2/ui.git;a%3Dsummary

+0

dzięki za akcję rozwiązania. Mam proste pytanie: nie wiem, aby usunąć plik remove_idx do którego pliku? dodaj "sprawdzanie użytkownika" po funkcji wysyłki() lub w funkcji dispatch() "modifi dispatch()". i gdzie używam kodu "usuń niepotrzebne strony"? Jestem zdezorientowany. Przepraszam za mój zły angielski. – omid

+0

Dodałem funkcję 'remove_idx' i sprawdzenie użytkownika, ale tylko usunięcie pozycji w renderowaniu pierwszej strony menu, ponowne załadowanie lub przejście do innej strony, elementy' leds' i 'packages' cofają się i są dostępne w menu. może być złe użycie sprawdź kod użytkownika, czy możesz mi pomóc? – omid

+0

Zarówno 'remove_idx()' i sprawdzanie autentyczności muszą znajdować się w pliku 'libs/web/luasrc/dispatcher.lua', ponieważ całe drzewo indeksów jest budowane zaraz po uruchomieniu interfejsu sieciowego routera. Sprawdzanie autentyczności użytkownika musi znajdować się w procedurze 'dispatch()', zaraz po kodzie, który pokazałem w mojej odpowiedzi. Jest to procedura, w której drzewo indeksów zostanie wypełnione. – yegorich