初期日志管理实现;使用AOP动态代理的方式完成日志管理,先定义一个切面切入点,然后使用环绕通知记录用户操作的的方法以及参数,并将数据回显到前端页面进行展示;
    mapper中的sql标签提取共性代码,使用时只需要在需要的地方添加 其中refid指的是 中的id
    菜单管理:
    表设计:菜单表与角色表是多对多的关系,在表设计时,多对多关系通常由中间表(关系表)进行维护,基于角色菜单表的设计,其角色和菜单对应的关系数据要存储到关系表中;
    image.png
    菜单目录显示:实现 首先是通过sql语句进行自连接查询菜单表,显示出上级菜单以及下级菜单的对应关系
    菜单删除操作:基于用户在列表页面上选择的的菜单记录ID,执行删除操作,本次删除业务实现中,首先要基于id判断当前菜单是否有子菜单,假如有子菜单则不允许删除,没有则先删除菜单角色关系数据(根据菜单id删除角色关系中的字段),然后再删除菜单自身信息。
    菜单添加业务实现:首先查出菜单的id,name(菜单名称),parentId(上级菜单),用于页面回显,选择要添加菜单的上级菜单.页面使用ztree结构进行显现:(具体怎么显示请问前端去),添加菜单时使用AJAX异步请求进行添加,用户在菜单添加页面中填写好菜单数据,然后点击保存按钮,将用户填写的数据添加到数据库
    菜单修改实现:前端提交修改数据,后端接收直接保存就好;

    角色管理:
    表设计:可以在添加角色时,为角色分配资源访问权限,最后将角色再分配给用户,
    CREATE TABLE sys_roles (
    id bigint(20) NOT NULL AUTO_INCREMENT,
    name varchar(100) DEFAULT NULL COMMENT ‘角色名称’,
    note varchar(500) DEFAULT NULL COMMENT ‘备注’,
    createdTime datetime DEFAULT NULL COMMENT ‘创建时间’,
    modifiedTime datetime DEFAULT NULL COMMENT ‘修改时间’,
    createdUser varchar(20) DEFAULT NULL COMMENT ‘创建用户’,
    modifiedUser varchar(20) DEFAULT NULL COMMENT ‘修改用户’,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8 COMMENT=’角色’;
    菜单与角色的关系表脚本设计如下:
    CREATE TABLE sys_role_menus (
    id int(11) NOT NULL AUTO_INCREMENT,
    role_id int(11) DEFAULT NULL COMMENT ‘角色ID’,
    menu_id int(11) DEFAULT NULL COMMENT ‘ID’,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT=’角色与菜单对应关系’;
    用户与角色关系表设计脚本如下:
    CREATE TABLE sys_user_roles (
    id int(11) NOT NULL AUTO_INCREMENT,
    user_id int(11) DEFAULT NULL COMMENT ‘用户ID’,
    role_id int(11) DEFAULT NULL COMMENT ‘角色ID’,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT=’用户与角色对应关系’;
    使用limit进行分页;模糊查询实现搜索;
    删除操作:
    基于用户在列表页面上选择的的用户记录ID,执行删除操作,本次删除业务实现中,首先要基于id删除角色菜单关系数据,然后基于id删除用户角色关系数据,最后删除角色自身信息
    操作基本类似菜单管理,只是多了一张表而已

    修改操作:
    在角色列表页面点击修改按钮时,基于id进行角色信息的查询,在查询角色信息时将角色信息与对应的菜单关系数据封装到到一个值对象,然后传递到客户端在修改页面进行呈现

    用户模块:
    本模块主要是实现对用户信息的管理,包括用户查询,保存,更新,禁用启用等操作。
    表关系以及授权访问图示:
    image.pngimage.png
    CREATE TABLE sys_users (
    id int(11) NOT NULL AUTO_INCREMENT,
    username varchar(50) NOT NULL COMMENT ‘用户名’,
    password varchar(100) DEFAULT NULL COMMENT ‘密码’,
    salt varchar(50) DEFAULT NULL COMMENT ‘盐’,
    email varchar(100) DEFAULT NULL COMMENT ‘邮箱’,
    mobile varchar(100) DEFAULT NULL COMMENT ‘手机号’,
    valid tinyint(4) DEFAULT NULL COMMENT ‘状态’,
    deptId int(11) DEFAULT NULL,
    createdTime datetime DEFAULT NULL COMMENT ‘创建时间’,
    modifiedTime datetime DEFAULT NULL COMMENT ‘修改时间’,
    createdUser varchar(20) DEFAULT NULL COMMENT ‘创建用户’,
    modifiedUser varchar(20) DEFAULT NULL COMMENT ‘修改用户’,
    PRIMARY KEY (id),
    UNIQUE KEY username (username)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT=’系统用户’;
    用户与角色的关系表脚本设计如下:
    CREATE TABLE sys_user_roles (
    id int(11) NOT NULL AUTO_INCREMENT,
    user_id int(11) DEFAULT NULL COMMENT ‘用户ID’,
    role_id int(11) DEFAULT NULL COMMENT ‘角色ID’,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT=’用户与角色对应关系’;
    页面呈现:首先准备用户列表页面,然后在starter.html页面中点击用户管理时异步加载用户列表页面,用户列表页面加载完成,启动用户数据的异步加载操作,本次列表页面要以分页形式呈现用户信息, 在mybatis的mapper文件中使用条件标签实现分页查询。
    角色分页页面加载完成以后,向服务端发起异步请求加载角色信息,当角色信息加载完成需要将角色信息、分页信息呈现到列表页面上。

    实现用户的禁用启用操作:
    在SysUserMapper.xml文件,添加修改用户状态的SQL元素定义,关键代码如下:

    update sys_users
    set valid=#{valid},
    modifiedUser=#{modifiedUser},
    modifiedTime=now()
    where id=#{id}

    用户在用户列表页面上点击禁用或按钮,将用户记录id异步提交到服务端,最后在服务端执行用户的禁用、启用动作。
    用户编辑页面呈现以后,发起异步任务从服务端获取角色信息然后呈现在页面上

    新增用户时会使用shiro里面的SimpleHash进行一个MD5加密;需要加入Shiro框架的依赖
    修改密码时会把用户传回的密码和盐值进行一次MD5加密,之后再与数据库中加密后的密码进行比对,如果比对失败则不允许更改,
    比对成功,就将用户提交的新密码进行保存
    用户更新:
    获取用户编辑页面数据,然后异步提交到服务端,将用户信息以及用户对应的角色关系数据更新到数据库。

    Spring中的线程池:
    在中启动类上加上@EnableAsync后在spring容器启动时会自动创建线程池,如果需要对Spring的线程池进行配置的话可以再yml.xml中进行配置,
    也可以自己实现一个线程池,实现AsyncConfigurer接口

    动吧重点:Shiro实现权限控制
    在概念层面呢Shiro主要的三个对象,一个是Subject主体对象,负责提交用户认证和授权信息,还有就是一个SecurityManager,他是一个安全管理器,负责认证授权等业务的实现,他的地位就像SpringMVC中的前端控制器差不多。还有就是一个Realm他是一个领域对象,负责的是与数据库进行交互,获取业务数据,
    因为在SpringBoot是没有提供shiro的自动化配置的,需要我们自己去进行一个配置,首先是要先创建Shiro的配置类,然后在配置类中添加加SecurityManager配置,ShiroFilterFactoryBean的配置,ShiroFilterFactoryBean她的作用是可以设置资源的匿名访问,认证访问,除了匿名(anon)访问的资源,其它都要认证(“authc”)后访问, 添加登录url的设置,可以再配置类中使用setLoginUrl()的方法进行指定。

    Shiro框架认证业务的实现:

    1. 系统调用subject的login方法将用户信息提交给SecurityManager
    2. SecurityManager将认证操作委托给认证器对象Authenticator
    3. Authenticator将用户输入的身份信息传递给Realm。
    4. Realm访问数据库获取用户信息然后对信息进行封装并返回。
    5. Authenticator 对realm返回的信息进行身份认证。


    • 业务描述及设计实现。

    在用户数据层对象SysUserDao中,按特定条件查询用户信息,并对其进行封装。基于用户名获取用户对象
    resultType=”com.cy.pj.sys.entity.SysUser”>
    select *
    from sys_users
    where username=#{username}

    本模块的业务在Realm类型的对象中进行实现,我们编写realm时,要继承
    AuthorizingRealm并重写相关方法,我这边是有用到setCredentialsMatcher,来设置凭证匹配器,(与用户添加操作使用相同的加密算法),
    AuthenticationInfo 通过此方法完成认证数据的获取及封装,(里边有一个UsernamePasswordTokenl来获取用处输入的用户名,然后基于这个用户名查询用户信息判断用户是否存在,是否禁用,然后封装用户信息返回给认证管理器(后续认证管理器会通过此信息完成认证操作),系统底层会将认证数据传递认证管理器,由认证管理器完成认证操作,对此realm,需要在SpringShiroConfig配置类中,注入给SecurityManager对象 ,然后在controller中创建一个Subject的对象,通过UsernamePasswordToken 的这个类对用户进行一个封装,然后把封装的token传入一个login()的方法提交用户信息,交给shiro框架进行认证操作,token会传给shiro的SecurityManager,SecurityManager将token传递给认证管理器,认证管理器会将token传递给realm
    到此完成认证的操作

    Shiro框架授权的实现:
    授权即对用户资源访问的授权(是否允许用户访问此资源),
    首先是在配置类中添加授权的配置,然后是基于用户id到用户角色表中找到角色id,然后基于角色Id到角色菜单关系表中找到菜单Id,基于菜单Id获取菜单的授权标识,
    返回给授权管理器,然后在需要授权的业务层方法上添加执行此方法需要的权限标识注解,参考代码@RequiresPermissions(“sys:user:update”)

    Shiro的扩展功能实现记住我操作:
    在controller中添加布尔类型的参数,是否记住我
    SpringShiroConfig配置类中添加记住我配置,存到Cookie中,然后为SecurityManager的配置添加RememberMeManager 的参数,然后修改shiro的过滤认证级别 然后ok