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标签,有点不大方便。

可以参考:https://blog.csdn.net/coolcaosj/article/details/25509471

至于怎么修改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';

 

你可能感兴趣的:(shiro)