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