用戶,角色,羣組,菜單權限控制

--用戶所擁有的菜單權限是三部分的並集:
--1,默認對"全部用戶"開放的菜單
--2,對特定角色開放的菜單,用戶所屬角色有(員工/客戶),角色是用戶的屬性,但不是必須屬性,可以沒有
--3,對指定羣組開放的菜單(這些羣組可以新增或刪除,如"Administrators","資訊中心","人力資源部","客服組")

--對菜單權限進行修改的時候要查詢出所有菜單,對一些特殊的菜單(如修改菜單的開放權限,新增菜單,羣組新增,羣組成員管理)
--授權的時候要注意只開放給特定的羣組或角色。

SELECT DISTINCT 
m3.menuxxid as m3_menuxxid,m3.menutext as m3_menutext,m3.suprxxid as m3_suprxxid,m3.signflag as m3_signflag,m3.sequence,'分隔列',
m2.menuxxid as m2_menuxxid,m2.menutext as m2_menutext,m2.suprxxid as m2_suprxxid,m2.signflag as m2_signflag,m2.sequence,'分隔列',
m1.menuxxid as m1_menuxxid,m1.menutext as m1_menutext,m1.suprxxid as m1_suprxxid,m1.signflag as m1_signflag,m1.sequence

FROM sysmenu m1
INNER JOIN sysmenu m2
ON m2.suprxxid = m1.menuxxid and m1.suprxxid = 100 --頂級菜單ID(100)
LEFT OUTER JOIN sysmenu m3
ON m3.suprxxid = m2.menuxxid

order by m1.sequence,m2.suprxxid,m2.sequence,m3.suprxxid,m3.sequence

--當上級菜單(一級,二級)定義爲不顯示,或只開放給特定羣組,或只開放給特定角色,這種限制會作用到它下面的子菜單

SELECT DISTINCT 
m1.menuxxid,m1.menutext,m1.suprxxid,m1.newindow,m1.hyperlink,m1.sequence,
m2.menuxxid,m2.menutext,m2.suprxxid,m2.newindow,m2.hyperlink,m2.sequence,
m3.menuxxid,m3.menutext,m3.suprxxid,m3.newindow,m3.hyperlink,m3.sequence

FROM
sysmenu m1
INNER JOIN sysmenu m2
ON m2.suprxxid = m1.menuxxid and m1.suprxxid = 100
LEFT OUTER JOIN sysmenu m3
ON m3.suprxxid = m2.menuxxid
,profile p LEFT OUTER JOIN grupuser u INNER JOIN  grupinfo i INNER JOIN  grupmenu g
ON i.grupxxid = g.grupxxid
ON u.grupxxid = i.grupxxid
ON p.loginxid = u.loginid

WHERE
p.loginxid = 'andy liu'
AND
(
  m1.pagecntl = 'Y'
  AND
  m1.signflag='80'
  OR
  (m1.signflag='81' AND p.usertype='10')
  OR
  (m1.signflag='82' AND p.usertype='11')
  OR
  (
    m1.signflag='83' AND g.menuxxid = m1.menuxxid
  )
)
AND
(
  m2.pagecntl = 'Y'
  AND
  m2.signflag='80'
  OR
  (m2.signflag='81' AND p.usertype='10')
  OR
  (m2.signflag='82' AND p.usertype='11')
  OR
  (
    m2.signflag='83' AND g.menuxxid = m2.menuxxid
  )
)
AND
(
  m3.menuxxid IS NULL
  OR
  (
   m3.pagecntl = 'Y'
   AND
   m3.signflag='80'
   OR
   (m3.signflag='81' AND p.usertype='10')
   OR
   (m3.signflag='82' AND p.usertype='11')
   OR
   (
    m3.signflag='83' AND g.menuxxid = m3.menuxxid
   )
  )
)
order by 6,9,12,15,18

 

上述SQL中的g.menuxxid = m3.menuxxid部分改爲IN語句;另外此SQL查出的記錄爲分層結構;要將其轉化成平鋪結構(不體現sysmenu的層次結構)可使用Union將一級,二級,三級菜單串起來。

 

***權限菜單所使用的數據庫可以跟存放生產數據的數據庫不同。

 

 

 

發佈了43 篇原創文章 · 獲贊 3 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章