权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源。
权限管理设计模型
用户权限管理模型(用到5张表:权限表、角色表、用户表、角色和权限关系表、用户和角色关系表)
本系统设计:
权限表:
使用第三方用户授权系统,权限表包括:系统表、模块表、操作表
用户表:
使用groupid区分不同的用户类型
使用sysid存储用户所属单位id
角色表:
用户角色对用户类型一对一。
用户角色采用系统初始化方式在系统中初始化。
用户和角色关系表:
使用第三方用户授权系统,用户和角色关系表包括:角色和系统对应关系表,角色和部署结点对应关系表,角色和模块对应关系表,角色和操作对应关系表
用户授权第三方系统集成
使用第三方系统管理完成用户授权,通过用户session接入接口,顺利进入第三方系统页面,完成用户授权操作。
Session接入接口定义
接口名称:模块操作Session接入
接口协议:http
接口地址: http://系统管理地址? loginkeyString=
接口功能:通过接口方式进行在系统管理中进行用户认证
接口方向:药品采购系统第三方系统管理
分析:
第一步:
用户点击菜单
进入药品采购系统action,生成加密的串,组织成接口地址
第二步:转发到第三方系统
返回数据:
无
获取用户权限
权限管理应用:用户授权验证
菜单权限(根据用户的角色显示不同的菜单)
验证用户权限菜单
使用不同的用户登录系统,根据用户的角色获取他的权限菜单在左侧显示
用户登录成功根据用户角色从数据库查询用户的菜单权限,并将菜单权限存储至session中,实现不同用户登录显示不同的菜单
dao:
根据角色查询所有权限菜单
<!-- <id为 主键,主键相同的合并 数据库的 column="menuid 对应 java对象的property="menuid -->
<resultMap id="findMenuByroleidResultMap" type="yycg.base.pojo.vo.Menu">
<id column="menuid" property="menuid" />
<result column="menuname" property="menuname" />
<!--二级菜单为一个集合collection 数据类型还是yycg.base.pojo.vo.Menu -->
<collection property="menus" ofType="yycg.base.pojo.vo.Menu">
<result column="menuid_two" property="menuid" />
<result column="menuname_two" property="menuname" />
<result column="url" property="url" />
</collection>
</resultMap>
<!-- resultMap 一对多查询 -->
<!-- 根据角色获取菜单(一、二级) -->
<select id="findMenuByroleid" parameterType="java.lang.String"
resultMap="findMenuByroleidResultMap"
>
select m1.moduleid menuid,
m1.name menuname,
m2.moduleid menuid_two,
m2.name menuname_two,
m2.url
from bss_sys_module m1, bss_sys_module m2
where m2.parentid = m1.moduleid
and m1.parentid = '0'
and m2.parentid != '0'
and m2.moduleid in(
<!--角色范围内的菜单 -->
select bss_sys_rolemodule.moduleid from bss_sys_role,bss_sys_rolesys,bss_sys_rolenode,bss_sys_rolemodule,bss_sys_roleoperate
where bss_sys_role.roleid=bss_sys_rolesys.roleid
and bss_sys_rolenode.rsid=bss_sys_rolesys.rsid
and bss_sys_rolemodule.rnid=bss_sys_rolenode.rnid
and bss_sys_roleoperate.rmid=bss_sys_rolemodule.rmid
and bss_sys_role.roleid=#{roleid}
)
order by m1.showorder,m2.showorder
</select>
<select id="findOperatByRoleid" parameterType="java.lang.String"
resultType="yycg.base.pojo.vo.Operation"
>
select bss_sys_operate.method actionUrl,
bss_sys_operate.operatename operationName,
bss_sys_operate.operateid operationId
from bss_sys_operate
where bss_sys_operate.operateid in
(
<!-- 角色范围内的操作权限集合 -->
select bss_sys_roleoperate.operateid
from bss_sys_role,
bss_sys_rolesys,
bss_sys_rolenode,
bss_sys_rolemodule,
bss_sys_roleoperate
where bss_sys_role.roleid = bss_sys_rolesys.roleid
and bss_sys_rolenode.rsid = bss_sys_rolesys.rsid
and bss_sys_rolemodule.rnid = bss_sys_rolenode.rnid
and bss_sys_roleoperate.rmid = bss_sys_rolemodule.rmid
and bss_sys_role.roleid = #{roleid}
)
</select>
service :
根据角色查询所有权限菜单
/**
* 根据角色id获取菜单
*/
public List<Menu> findMenuByroleid(String roleid) throws Exception {
return sysuserMapperCustom.findMenuByroleid(roleid);
}
/**
* 根据用户角色获取操作权限
*/
@Override
public List<Operation> findOperatByRoleid(String roleid) throws Exception {
// TODO Auto-generated method stub
return sysuserMapperCustom.findOperatByRoleid(roleid);
}
action :
在登录的action 中将权限信息存在session 中
// 构建ActiveUser 用户身份信息
ActiveUser activeUser = new ActiveUser();
activeUser.setUserid(userid);
activeUser.setUsername(sysuser.getUsername());
activeUser.setGroupid(sysuser.getGroupid());
activeUser.setSysid(sysuser.getSysid());
activeUser.setSysmc(this.findSysMc(sysuser.getGroupid(),
sysuser.getSysid()));// 单位名称
// 根据角色取出菜单
// 获得角色id
String roleid = systemConfigService.findDictinfoByDictcode("s01",
sysuser.getGroupid()).getRemark();
// 根据角色id获取菜单
List<Menu> menu_list = sysuserMapperCustom.findMenuByroleid(roleid);
Menu menu = new Menu();
menu.setMenus(menu_list);
activeUser.setMenu(menu);// 将用户菜单存入用户身份对象中
// 根据用户角色获取操作权限
List<Operation> operations = sysuserMapperCustom
.findOperatByRoleid(roleid);
activeUser.setOperationList(operations);// 将用户操作权限存入用户身份对象中
return activeUser;
在登录提交的action 中将用户信息存入session
// 用户认证
ActiveUser activeUser = userService.checkUserInfo(userid, pwd);
// 将用户信息写入session
session.setAttribute(Config.ACTIVEUSER_KEY, activeUser);
// 欢迎xx 用户登录
return ResultUtil.createSubmitResult(ResultUtil.createSuccess(
Config.MESSAGE, 107, new Object[] { "" }));