2013-08-22 7 views
5

लक्ष्य: दो उपयोगकर्ता रूट और उपयोगकर्ता। रूट वेब-इंटरफ़ेस के माध्यम से सबकुछ एक्सेस कर सकता है, लेकिन उपयोगकर्ता को मेनू के केवल कुछ हिस्सों को देखना चाहिए।ओपनवर्ट: लुसीआई: सीमित उपयोगकर्ता पहुंच को कैसे कार्यान्वित करें

एक विकल्प प्रश्न में प्रत्येक मॉड्यूल के लिए "sysauth" विकल्प पारित करना होगा। यह बहुत व्यावहारिक नहीं है, क्योंकि उपयोगकर्ता प्रत्येक मेनू प्रविष्टि को देखेगा और उसे हर मेनू के लिए लॉगिन पेज मिलेगा जिसकी उसे अनुमति नहीं है।

मेरा विचार यह पता लगाने के लिए है कि कौन लॉग ऑन है और फिर प्रत्येक प्रतिबंधित मॉड्यूल के इंडेक्स() फ़ंक्शन में कुछ भी नहीं करें। अब तक मुझे लुसीआई एपीआई (http://luci.subsignal.org/api/luci/) में ऐसा कोई फ़ंक्शन नहीं मिला, जो वर्तमान लॉग उपयोगकर्ता को वापस कर देगा।

मुझे पता है कि OpenWrt/LuCI (https://forum.openwrt.org/viewtopic.php?pid=163013#p163013) में अतिरिक्त उपयोगकर्ताओं को कैसे जोड़ना है। लेकिन यह केवल समाधान का एक हिस्सा है।

कोई विचार, मेरा लक्ष्य कैसे प्राप्त करें?

उत्तर

3

मैंने तालिका से अनियंत्रित कुंजी खोजने और निकालने के लिए यहां वर्णित एक लुआ फ़ंक्शन बनाने का अंत किया: 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 

यह एक छोटा सा त्वरित और गंदी है, लेकिन यह काम करता है। कृपया ध्यान दें, यूआरएल में हेरफेर करने से तक सीधी पहुंच अभी भी संभव है।

अद्यतन

LuCI2 एसीएल समर्थन und बहु उपयोगकर्ता वातावरण प्रदान करेगा: शेयर अपने समाधान के लिए http://git.openwrt.org/?p=project/luci2/ui.git;a%3Dsummary

+0

धन्यवाद। मेरे पास एक साधारण सवाल है: मुझे नहीं पता कि remove_idx किस फ़ाइल को लिखता है? प्रेषण() फ़ंक्शन या प्रेषण() 'modifi प्रेषण()' के बाद "उपयोगकर्ता जांच" जोड़ें। और जहां मैं "अनियंत्रित पृष्ठों को हटाएं" कोड का उपयोग करता हूं? मैं उलझन में हूँ। मेरी खराब इंग्लिश के लिए माफ़ कीजिये। – omid

+0

मैंने 'remove_idx' फ़ंक्शन और उपयोगकर्ता चेक जोड़ा, लेकिन मेनू में पहले आइटम को रेंडर करें या फिर दूसरे पृष्ठ पर जाएं, 'leds' और' packages' आइटम वापस जाएं और मेनू में उपलब्ध हों। हो सकता है कि मैं खराब उपयोग उपयोगकर्ता कोड की जांच कर सकता हूं, क्या आप कृपया मेरी मदद कर सकते हैं? – omid

+0

दोनों 'remove_idx()' और प्रमाणीकरण जांच 'libs/web/luasrc/dispatcher.lua' फ़ाइल में होनी चाहिए, क्योंकि जैसे ही आप राउटर वेब इंटरफ़ेस खोलते हैं, संपूर्ण इंडेक्स पेड़ बनाया जाता है। मेरे उत्तर में दिखाए गए कोड के ठीक बाद, उपयोगकर्ता प्रमाणीकरण जांच 'प्रेषण()' दिनचर्या में होनी चाहिए। यह दिनचर्या है, जहां सूचकांक का पेड़ भर जाएगा। – yegorich

संबंधित मुद्दे