在很多系统中需要使用权限控制,来控制不同角色的人访问不同的资源。表达能力不好,不喜勿喷!
环境: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';