2013-08-22 2 views
5

Цель: два пользователя root и пользователь. Root может получить доступ ко всему через веб-интерфейс, но пользователь должен видеть только некоторые части меню.OpenWrt: LuCI: как реализовать ограниченный доступ пользователя

Одним из вариантов является передача опции «sysauth» для каждого модуля. Это не очень практично, потому что пользователь увидит каждую запись в меню и получит страницу входа для каждого меню, которое ему не разрешено.

Моя идея - выяснить, кто входит в систему, а затем ничего не делает в функции index() каждого ограниченного модуля. До сих пор я не мог найти такую ​​функцию в LuCI API (http://luci.subsignal.org/api/luci/), которая вернет текущего зарегистрированного пользователя.

Я знаю, как добавить дополнительных пользователей в OpenWrt/LuCI (https://forum.openwrt.org/viewtopic.php?pid=163013#p163013). Но это лишь часть решения.

Любая идея, как достичь моей цели?

ответ

3

В результате я создал функцию Lua, как описано здесь: 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 

А затем вставляется мой чек пользователя и страница удалять после в LIBS/веб/luasrc/dispatcher.lua отправки():

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

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

Вот как я удалить ненужные страницы в зависимости от того, кто вошел в систему :

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

Немного быстро и грязно, но это работает. Обратите внимание, что прямой доступ к , управляющий URL-адресом, по-прежнему возможен.

Update

LuCI2 обеспечит ACL среды поддержки унд многопользовательский: http://git.openwrt.org/?p=project/luci2/ui.git;a%3Dsummary

+0

спасибо за акцию ваше решение. У меня есть простой вопрос: я не знаю, что remove_idx пишет в какой файл? добавить «пользовательский чек» после отправки() или отправки() «modifi dispatch()». и где я использую код «удалить ненужные страницы»? Я смущен. Извините за мой плохой английский. – omid

+0

я добавил функцию 'remove_idx' и пользовательскую проверку, но только удаляю элемент в рендеринге первой страницы меню, если перезагружать или переходить на другую страницу, элементы' leds' и 'packages' возвращаются и доступны в меню. может быть я плохо использую проверить код пользователя, можете ли вы мне помочь? – omid

+0

Оба метода 'remove_idx()' и проверка подлинности должны находиться в файле 'libs/web/luasrc/dispatcher.lua', потому что все дерево индексов создается, как только вы открываете веб-интерфейс маршрутизаторов. Проверка подлинности пользователя должна быть в подпрограмме 'dispatch()' сразу после кода, который я показал в своем ответе. Это обычная процедура, в которой будет заполнено дерево индексов. – yegorich

Смежные вопросы