1. 权限管理功能 企业实现
第一种 使用开源权限控制框架
第二种 自定义权限管理模块
1.1. 开源权限控制技术
Spring Security是一个能够为基于Spring的企业应用系统提供描述性安全访问控制解决方案的安全框架。
它提供了一组可以在Spring应用上下文中配 置的Bean,充分利用了Spring IoC(依赖注入,也称控制反转)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的 工作。
Apache shiro 开源免费的权限控制框架, Shiro 是一个用 Java 语言实现的框架,通过一个简单易用的 API 提供身份验证和授权。
使用 Shiro,您就能够为您的应用程序提供安全性而又无需从头编写所有代码。(与任何使用技术无关 , 用于任何JavaSE 和 JavaEE 项目中 )
1.2. 自定义权限控制模型
优点: 更加灵活,简化便于使用
目标: 自定义通用权限控制模型,可以用于任何的项目
1.2.1. 权限模型数据模型
问题: 数据表设计 ?
四个概念:
系统功能 (权限管理目的,就是为了对系统的功能访问进行控制 )
功能: 菜单项的功能 和 页面内部按钮功能
菜单功能
页面按钮功能
权限 ,具有访问某个功能的权限 ,权限和功能关系可以是 一对一 或者 多对多
角色 ,角色是权限的集合 ,为了方便用户授权 ,有了角色后,只需要将角色授予用户
用户 ,登陆系统的用户,具有角色,拥有系统功能权限
功能、权限、角色、用户 四者之间 都可以是多对多关系 —- 完整复杂权限模型有七张表 !
1.2.2. 今天系统的权限模型
用户表 user
功能权限表 auth_function
角色表 auth_role
角色-权限关系表 role_function
1.2.3. 自定义权限模型的权限控制原理
使用自定义注解+反射技术,基于代理 对业务方法访问 实现细粒度的权限控制
提供权限管理系统数据:
权限控制原理分析: 基于 自定义注解+ 代理+ 反射 实现方法级别权限控制
2. 设计权限管理数据表
auth_function 表 (id , name, description )
auth_role 表 (id , name , description )
user 表 添加 role_id 外键
问题: 实现动态菜单功能 ?
根据当前用户权限查询菜单项,生成菜单
需要将菜单一些数据 保存 auth_function 表
设计 Function 类
/**
* 系统功能权限
*
* @author seawind
*
*/
public class Function {
private String id; // uuid
private String name; // 功能名称
private String description; // 功能描述
// 菜单项功能
private String generateMenu; // 是否生成菜单
private int zindex; // 菜单项优先级
private String page; // 点击菜单 跳转页面
private Function parentFunction;// 父功能点
private Set<Function> childrenFunctions = new HashSet<Function>(); // 子功能点
// 一个Function 属于很多 Role
private Set<Role> roles = new HashSet<Role>();
}
配置Function.hbm.xml
<class name="cn.itcast.bos.domain.auth.Function" table="auth_function">
<id name="id">
<generator class="uuid"></generator>
</id>
<!-- 下面列要按照顺序 -->
<property name="name" unique="true"></property>
<property name="description"></property>
<property name="page"></property>
<property name="generateMenu"></property>
<property name="zindex"></property>
<!-- 表关联 -->
<many-to-one name="parentFunction" class="cn.itcast.bos.domain.auth.Function" column="pid"></many-to-one>
<set name="childrenFunctions">
<key column="pid"></key>
<one-to-many class="cn.itcast.bos.domain.auth.Function"/>
</set>
<set name="roles" table="role_function">
<key column="function_id"></key>
<many-to-many class="cn.itcast.bos.domain.auth.Role" column="role_id"></many-to-many>
</set>
</class>
设计 Role 类
/**
* 系统角色
*
* @author seawind
*
*/
public class Role {
private String id; // uuid
private String name; // 角色名称
private String description; // 角色描述
// 关联Function
private Set<Function> functions = new HashSet<Function>();
// 关联user
private Set<User> users = new HashSet<User>();
}
编写Role.hbm.xml
<class name="cn.itcast.bos.domain.auth.Role" table="auth_role">
<id name="id">
<generator class="uuid"></generator>
</id>
<property name="name" unique="true"></property>
<property name="description"></property>
<!-- 关联 -->
<set name="functions" table="role_function">
<key column="role_id"></key>
<many-to-many class="cn.itcast.bos.domain.auth.Function" column="function_id"></many-to-many>
</set>
<set name="users">
<key column="role_id"></key>
<one-to-many class="cn.itcast.bos.domain.user.User"/>
</set>