2013-08-22 3 views
5

목표 : 두 명의 사용자가 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을 조작하는 에 의한 직접 액세스가 여전히 가능하다는 점에 유의하십시오.

업데이트

LuCI2는 ACL 지원 싶게 다중 사용자 환경을 제공 할 것입니다 : 공유 솔루션에 대한 http://git.openwrt.org/?p=project/luci2/ui.git;a%3Dsummary

+0

감사합니다. 나는 간단한 질문이있다 : 나는 remove_idx가 어떤 파일에 쓰는지 모른다. dispatch() 함수 또는 dispatch() 'modifi dispatch()'뒤에 "user check"을 추가하십시오. 어디에서 "불필요한 페이지 제거"코드를 사용합니까? 혼란 스럽습니다. 내 하찮은 영어 실력에 죄송하다는 말씀을 드리고 싶습니다. – omid

+0

'remove_idx' 기능과 사용자 체크를 추가했지만 메뉴 첫 페이지 렌더링에서 항목 만 제거했습니다. 다시로드하거나 다른 페이지로 이동하면'leds'와'packages' 항목이 돌아가서 메뉴에서 사용할 수 있습니다. 나는 나쁜 코드를 사용하여 사용자 코드를 검사 할 수 있습니다. 제발 저를 도울 수 있습니까? – omid

+0

'remove_idx()'와 인증 검사는 모두'libs/web/luasrc/dispatcher.lua' 파일에 있어야합니다. 왜냐하면 전체 색인 트리는 라우터 웹 인터페이스를 열 자마자 만들어지기 때문입니다. 사용자 인증 확인은 답안에서 보여준 코드 직후에'dispatch()'루틴에 있어야합니다. 인덱스 트리가 채워지는 루틴입니다. – yegorich