Shiro——實現許可權控制demo思路(包含自定義標籤hasAnyPermission)
阿新 • • 發佈:2018-12-19
在很多系統中需要使用許可權控制,來控制不同角色的人訪問不同的資源。表達能力不好,不喜勿噴!
環境:eclipse4.5.2+oracle11g+hibernate4+spring4+shiro+jboss
原始碼(工程)+ 資料表sql(包含初始化資料)+hibernate4的包下載:原始碼下載
一、許可權實現思路:
1、建立一個的許可權存在Tpopedom表中,本Demo中“父許可權ID”和“樹的連線路徑”並未使用。
2、將選單名稱及URL連結和所需許可權的ID(所需許可權ID直接查詢Tpopedom,在建立選單是下拉選擇)儲存在Tmenu表中。
3、建立一個角色“admin”存在Trole表中。
4、建立一個使用者“admin”存在Tuser表中。
5、給角色“admin”賦予一個許可權,角色和許可權的關係在TRole_popedom表中。
6、給使用者“admin”賦予“admin”角色,角色和使用者的關係存在TUser_role表彙總。
總的來說:就是將許可權賦給角色,再將角色賦給使用者。當登入成功後在Shiro標籤內遍歷選單,登入使用者沒有許可權訪問的選單直接不顯示。
二、過程中遇到的問題:
shiro提供了jsp標籤用於頁面上的許可權控制,有hasAnyRoles,hasPermission等標籤,但是卻沒提供hasAnyPermission標籤,有點不大方便。
至於怎麼修改jar檔案,可以直接用壓縮軟體開啟jar,然後將修改後的java編譯成的class扔進對應的路徑下,資原始檔也可以拷出來修改之後替換原來的資原始檔。
三、表結構
以下看看錶結構,本次Demo做的比較簡單,表結構裡面部分欄位並未使用:
create table Tuser( userid varchar2(50) primary key, username varchar2(100), userpassword varchar2(4000) ); comment on table Tuser is '使用者資訊表'; comment on column Tuser.userid is '使用者ID'; comment on column Tuser.username is '使用者名稱'; comment on column Tuser.userpassword is '密碼'; create table Trole ( roleid varchar2(50) primary key, rolename varchar2(100) ); comment on table Trole is '角色表'; comment on column Trole.roleid is '角色ID'; comment on column Trole.rolename is '角色名稱'; create table Tpopedom ( popedomid varchar2(50) primary key, popedomname varchar2(100), popedomfatherid varchar2(50), popedomurl varchar2(100) ); comment on table Tpopedom is '許可權選單表'; comment on column Tpopedom.popedomid is '許可權ID'; comment on column Tpopedom.popedomname is '許可權名稱'; comment on column Tpopedom.popedomfatherid is '許可權父ID'; comment on column Tpopedom.popedomurl is '樹的連線路徑'; create table Tuser_role ( connectionid varchar2(50) primary key, userid varchar2(50) not null, roleid varchar2(50) not null ); comment on table Tuser_role is '使用者與角色關係表'; comment on column Tuser_role.connectionid is '關係ID'; comment on column Tuser_role.userid is '管理員表ID'; comment on column Tuser_role.roleid is '角色Id'; create table Trole_popedom ( connectionid varchar2(50) primary key, roleid varchar2(50) not null, popedomid varchar2(50) not null, popedom varchar2(50) ); comment on table Trole_popedom is '角色與許可權表'; comment on column Trole_popedom.connectionid is '關係Id'; comment on column Trole_popedom.roleid is '角色ID'; comment on column Trole_popedom.popedomid is '許可權Id'; comment on column Trole_popedom.popedom is '許可權 (1為可用,2為不可用)'; create table Tmenu( menuId varchar2(50), menuName varchar2(100), menuUrl varchar2(100), fatherMenuId varchar2(50), isUrl varchar2(1), popedomId varchar2(4000) ); comment on table Tmenu is '被控制的選單表'; comment on column Tmenu.menuId is '選單ID'; comment on column Tmenu.menuName is '選單名稱'; comment on column Tmenu.menuUrl is '選單對應的URL'; comment on column Tmenu.fatherMenuName is '上級選單ID'; comment on column Tmenu.isUrl is '是否有連線(0:沒有,1:有)'; comment on column Tmenu.popedomId is '可以訪問本連線的許可權ID';