发表于: 2018-10-14 22:38:32
1 492
今天完成的事情:
快乐水-樱桃可乐方案:
后台管理:
权限方案:
后台微服务通过mybatis操作5个表(账户、账户角色映射表、角色表、角色模块映射表、模块表),除了后台管理需要的16个接口以外,再添加三个接口(登录接口、注销接口、获取左边栏模块显示接口)
登录接口:
前后端交互:
方案:
提供登录接口给前端调用,前端传入账户密码,验证正确后,后端查询账户的所有角色、权限(模块)生成JWT放置到响应头中, 前端从响应头中获取JWT。每次访问将JWT放置在请求头中,用于登录验证与权限控制。与此同时将生成的JWT保存一份到redis中,作为判断登录状态的依据。并查询登录账户的Id以及角色放置到返回结果的date中,用于前端的登录后右上角的登录显示。
参数:
SQL:
根据账号名查询密码与盐值
SELECT
manager.`password`,manager.salt,is_locked
from manager
where account=账户名
后端登录验证:
方案:
前端每次请求都先通过zull,在zull网关中通过获取请求头中的JWT,读取redis中是否存在对应的缓存,判断用户是否已登录。
对于只需要登录即可访问的接口,验证登录成功则放行到对应的微服务中。
对于需要鉴权才可访问的接口,验证登录成功后解码JWT获取用户具有的权限,具有访问接口需要的权限才放行到对应的对应的微服务中。
对于无法完成登录验证或者鉴权的请求,在zull重定向到报错的控制器中。
注销接口:
需求:
让前端传递过来的JWT无效。
方案:
当用户登录成功时,生成JWT的同时,保存一份到redis缓存中。通过redis的主从设置,在zull中设置一个redis的从库,每一次在zull中先判断缓存中是否存在该jwt。
当前端调用注销接口时,在主redis中删除掉对应的jwt。此时zuul中的从redis中将不再存在对于的jwt,从而实现注销逻辑.
显示左边栏的接口:
需求:
不同账户登录后只显示具有访问权限的模块
方案:
前端登录成功后,将登录账户的id作为参数,调用登录接口,获取该用户的权限(模块),前端根据用户具有的权限(模块)显示模块。
接口参数:
SQL:
根据账户id和父模块id获取子模块
SELECT
module.id as id,module.module_name as name
from manager
LEFT JOIN manager_role on (manager.id=manager_role.user_id)
LEFT JOIN role_module on (manager_role.role_id=role_module.role_id)
LEFT JOIN module on (role_module.module_name=module.module_name)
where manager.id=账户ID and module.father_module=父模块ID
在Service层通过父模块获取子模块的方式,嵌套查询子模块构造三层模块列表。
密码管理:
需求:
作为一个管理员,我想要修改后台账号密码,以便于保证后台账号的安全性。
方案:
对前端提供修改密码的接口,从JWT中获取当前操作者的ID与入 参对比后,通过更新sql语句更新后台账户表的密码;
参数:
SQL:
更新账户密码
update
manager
SET password = 新密码,salt=UUID
WHERE id = 账户ID
账户管理:
需求:
作为一个管理员,我想要可以对所有的账号角色进行增删改查的操作,以便我对不同账号的角色管理。
方案:
进入账户管理页面后,前端通过页码调用获取账户列表的接口查询账户表中分页数据,并调用获取角色接口查询角色表中不重复的角色
接口1:
查询账户列表
方案:
使用分页逻辑将指定的页码中的账户和对应的角色通过SQL语句查询出一个账户集合。
参数:
SQL语句:
联表查询账户表与角色表的数据
select
manager.id,manager.serial_id,manager.account,
role.id as r_id,role.role_name,manager.is_locked,
manager.created_by,manager.updated_at,manager.created_at,manager.updated_by
from manager
LEFT JOIN manager_role ON (manager.id=manager_role.user_id)
LEFT JOIN role ON (role.id=manager_role.role_id)
接口2:
查询不重复角色
方案:
通过查询角色表获取不重复的角色列表
参数:
无
SQL:
查询所有角色名(去重)
select
role_name
from role
group by role_name
接口3
模糊查询账户列表
方案:
通过模糊查询、动态Sql、联表查询,分页逻辑,从账户表、账户角色映射表、角色表中查询出需要(账户ID、角色、账户名、创建人)的指定页码的账户列表集合。
参数:
SQL语句:
根据模糊条件联表查询账户表、角色表记录
select
manager.id,manager.serial_id,manager.account,
role.id as r_id,role.role_name,manager.is_locked,
manager.created_by,manager.updated_at,manager.created_at,manager.updated_by
from manager
LEFT JOIN manager_role ON (manager.id=manager_role.user_id)
LEFT JOIN role ON (role.id=manager_role.role_id)
where
manager.serial_id like '%账户ID%'
and role.role_name = '角色名'
and manager.account like '%账户名%'
and manager.created_by like '%创建人%'
接口4
新增账户
方案:
通过mysql事务,分别添加两条记录到后台账户表和账号角色映射表中。
参数:
SQL:
更新账户表
INSERT
INTOmanager
(manager.id as m_id,
manager.serial_id,
manager.account,
role.id as r_id,
role.role_name,
manager.is_locked,
manager.created_by,
manager.updated_at,
manager.created_at,
manager.updated_by)
VALUES
(账户,密码,盐值,冻结状态,更新人,创建人,更新时间,创建时间);
接口5(编辑账户)方案:通过mysql事务,分别修改后台账户表和账号角色映射表中的相关记录。
修改账户角色映射表的操作:先删除掉该账户在账户角色映射表中的所有记录,然后将新的账户角色关系批量插入到账户角色映射表中。
接口6(删除账户)方案:通过mysql事务删除语句,到后台账户表和账号角色映射表中删除指定的账户记录,并删除掉redis中的对应缓存(完成退出登录的需求)。
角色管理:
作为一名管理员,我想要对所有的模块内容进行增删改查的统一管理,以便我对不同模块的内容设置。
接口1(多条件模糊查询)方案:通过模糊查询、动态Sql、分页逻辑,从角色表中查询出需要的指定页码的数据集合。
接口2(角色列表)方案:(形参:页码)使用分页逻辑将指定的页码中的账户通过SQL语句查询出一个角色集合。
接口3(新增)方案:通过mysql事务,分别添加两条记录到角色表和角色权限(模块)映射表中。
接口4(编辑)方案:通过mysql事务,分别修改角色表和角色权限(模块)映射表中的相关记录。
更新角色权限映射表的操作:先删除掉该账号的所有权限,然后通过批量添加语句在用户角色映射表中添加记录。
接口5(删除)方案:通过mysql事务删除语句,到角色表和角色权限映射表,以及角色账户映射表中删除指定的记录,同时获取具有该角色的账户ID,删除掉redis中的对应缓存(完成退出操作)。
模块管理:
接口1(多条件查询)方案:通过模糊查询、动态Sql、分页逻辑,从模块(权限)表中查询出需要的指定页码的数据集合。
接口2(模块列表)方案:(形参:页码)使用分页逻辑将指定的页码中的账户通过SQL语句查询出一个模块集合。
接口3(新增)方案:通过mysql添加语句,添加记录到权限(模块)表中。
接口4(编辑)方案:通过mysql更新语句,修改角色权限(模块)表中记录。
接口5(删除)方案:通过mysql删除语句,到角色权限(模块)表中删除指定的记录,并获取到具有该权限的账户,删除掉redis中的对应缓存(完成退出操作)。
明天计划的事情:
汇总复盘评审方案
遇到的问题:
收获:
如上
评论