Authentication OpenWrt:LuCI:如何实现有限的用户访问

Authentication OpenWrt:LuCI:如何实现有限的用户访问,authentication,lua,openwrt,Authentication,Lua,Openwrt,目标:两个用户root和user。Root用户可以通过web界面访问所有内容,但用户只能看到菜单的某些部分 一个选项是将“sysauth”选项传递给每个有问题的模块。这是不太实际的,因为用户会看到每个菜单条目,并且会得到每个菜单的登录页面,他是不允许的 我的想法是找出谁登录了,然后在每个受限模块的index()函数中什么都不做。到目前为止,我在luciapi()中找不到这样一个函数,它将返回当前登录的用户 我知道如何在OpenWrt/LuCI()中添加其他用户。但这只是解决方案的一部分 有什么想

目标:两个用户root和user。Root用户可以通过web界面访问所有内容,但用户只能看到菜单的某些部分

一个选项是将“sysauth”选项传递给每个有问题的模块。这是不太实际的,因为用户会看到每个菜单条目,并且会得到每个菜单的登录页面,他是不允许的

我的想法是找出谁登录了,然后在每个受限模块的index()函数中什么都不做。到目前为止,我在luciapi()中找不到这样一个函数,它将返回当前登录的用户

我知道如何在OpenWrt/LuCI()中添加其他用户。但这只是解决方案的一部分


有什么想法,如何实现我的目标吗?

我最终创建了一个Lua函数,如这里所述:,用于查找并从表中删除不需要的键

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/web/luasrc/dispatcher.lua dispatch()中插入“我的用户检查”和“页面删除”:

这就是根据登录用户删除不需要的页面的方式:

    if ctx.authuser == "user" then
            remove_idx(ctx.tree, "packages")
            remove_idx(ctx.tree, "leds")
    end
这是一个有点快和肮脏,但它的工作。请注意,通过 操纵URL仍然是可能的

更新


LuCI2将提供ACL支持和多用户环境:

感谢您分享您的解决方案。我有一个简单的问题:我不知道remove_idx写入哪个文件?在dispatch()函数之后或dispatch()中的“modifi dispatch()”中添加“用户检查”。我在哪里使用“删除不需要的页面”代码?我很困惑。对不起,我的英语不好。我添加了
remove_idx
功能和用户检查,但仅删除菜单首页渲染中的项目,如果重新加载或转到其他页面,
LED
软件包
项目返回并在菜单中可用。可能是我使用了错误的检查用户代码,您能帮我吗?
remove_idx()
和身份验证检查都必须在
libs/web/luasrc/dispatcher.lua
文件中,因为整个索引树是在您打开路由器web界面时建立的。用户身份验证检查必须在
dispatch()
例程中,就在我在回答中显示的代码之后。这是将填充索引树的例程。我在
如果是c和c.index…
之后添加了
如果是ctx.authuser…
,如果我单击系统或网络菜单,
LED
软件包
在菜单列表中不可用,但是如果我单击
dhcp
启动
。。。,
LED
packages
在菜单列表中可用。我通过在
remove_idx()
调用中将
c
替换为
ctx.tree
解决了重新显示子选项卡的问题。但通过操纵URL直接访问仍然是可能的。
    if ctx.authuser == "user" then
            remove_idx(ctx.tree, "packages")
            remove_idx(ctx.tree, "leds")
    end