1. 程式人生 > >Shiro——實現許可權控制demo思路(包含自定義標籤hasAnyPermission)

Shiro——實現許可權控制demo思路(包含自定義標籤hasAnyPermission)

在很多系統中需要使用許可權控制,來控制不同角色的人訪問不同的資源。表達能力不好,不喜勿噴!

環境: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';