宅急送 项目第十天 权限管理

本文详细介绍了自定义权限管理模型的实现,包括数据模型设计、权限控制原理,以及在实际项目中的应用,如角色和用户管理、权限拦截等。通过对Spring Security和Apache Shiro的比较,阐述了自定义权限模型的优势。并分享了动态菜单和页面功能按钮的权限控制策略。
摘要由CSDN通过智能技术生成

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值