1.认证和权限的概念介绍

权限:属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则和安全策略控制用户可以访问而且只能访问自己被授权的资源,主要包括用户的身份认证和请求鉴权两部分,简称认证鉴权。
认证:判断一个用户是否为合法用户的处理过程,最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。
认证方式:用户名密码认证、手机号验证码认证、三方认证(微信登录、qq登录、微博登录、支付宝登录)
匿名访问:不需要认证即可访问。
匿名资源:不需要认证即可访问的资源。
匿名用户:不需要认证的用户。
鉴权:即访问控制,控制谁能访问哪些资源,先进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。
权限控制:用户是某个角色或拥有某个资源时,才可访问系统资源称之为权限控制。
权限控制模型(RBAC):
基于角色(Role-Based Access Control):是以角色为中心进行访问控制。
基于资源(Resource-Based Access Control):是以资源为中心进行访问控制,常用的权限管理方法,思路:将系统操作的每个url配置在资源表中,将资源对应到角色,将角色分配给用户,用户访问系统功能通过Filter进行过滤,过滤器获取到用户访问的url,只要访问的url是用户分配角色中的url则放行,继续访问。
spring-security保护资源:基于url地址、菜单、按钮
spring-security会给没有认证的用户分配一个账号,用户名:anyMoussyuser
基于资源的RBAC模型流程.png

2.项目中的权限控制是怎么设计的?

权限设计.png
表关系:
4张主体表(企业主体表、用户表、角色表、资源表),两张中间表(角色资源表、用户角色表)
一个企业对应多个用户
一个 用户对应多个角色
一个角色对应多个资源

3.企业信息的功能需求及涉及的数据库表结构?

企业信息数据库的表结构:

  1. CREATE TABLE `tab_enterprise` (
  2. `id` bigint(18) NOT NULL,
  3. `enterprise_id` bigint(18) NOT NULL COMMENT '商户ID【系统内部识别使用】',***
  4. `enterprise_name` varchar(200) COLLATE utf8_bin NOT NULL COMMENT '企业名称',***
  5. `enterprise_no` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '工商号',***
  6. `province` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '地址(省)',***
  7. `area` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '地址(区)',***
  8. `city` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '地址(市)',***
  9. `address` varchar(200) COLLATE utf8_bin NOT NULL COMMENT '详细地址',***
  10. `status` varchar(8) COLLATE utf8_bin NOT NULL COMMENT '状态(试用:trial,停用:stop,正式:official)',***
  11. `proposer_Id` bigint(18) DEFAULT NULL COMMENT '申请人Id',***
  12. `enable_flag` varchar(18) CHARACTER SET utf8 NOT NULL COMMENT '是否有效',
  13. `created_time` datetime NOT NULL COMMENT '创建时间',
  14. `updated_time` datetime NOT NULL COMMENT '创建时间',
  15. `expire_time` datetime NOT NULL COMMENT '到期时间 (试用下是默认七天后到期,状态改成停用)',***
  16. `web_site` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '商户门店web站点',
  17. `sharding_id` bigint(18) NOT NULL COMMENT '分库id',
  18. `app_web_site` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '商户h5web站点',***
  19. PRIMARY KEY (`id`)
  20. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='企业账号管理';
  1. **注意:商户id[系统内部识别使用]一经设置,不得再修改,其作用是为了数据隔离,本项目是一个SAAS平台,会有N多个商家在平台入驻,商户id就是用来隔离这些商家数据的**<br />**到期时间expire_time设置,原因:1.本项目是一个SAAS平台,收费方式是采用租赁的方式,即到期之后商家如果不续费就不能继续使用了;2.项目上线之后,业务员地推会给商家一个试用期,也可以通过到期时间来设置试用期限。**<br />**功能需求:CRUD,商家申请入驻后有一个审核的按钮。**

4.为什么要给商家绑定域名?(如何做数据隔离绑定域名、企业号)

商家入驻流程.png
商家平台打开流程:
1.员工在浏览器中发起ppsk.shop.eehp.cn的访问请求;
2.阿里云域名解析会把ppsk.shop.eehp.cn网址解析到阿里云ECS服务器;
3.阿里云ECS服务器宿主机会把信息转发到docker-nignx服务器;
4.docker-nignx服务器会根据配置的serverName【*.shop.eehp.cn】转发到restkeeper-gateway-shop服务;
5.restkeeper-gateway-shop服务很根据域名【ppsk.shop.eehp.cn】兑换成对应的企业号100001
6.根据企业号100001访问目标的商家平台A
企业号和域名是如何建立关联?(在项目中是如何实现的)
model-security-producer模块下的InitEnterpriseWebSiteInfo类下有4个方法:
1.**init()**:初始化企业站点信息到redis,此方法上有**@PostConstruct**解,表示项目启东时即加载信息;

  1. 1.创建query对象
  2. 2.构建查询条件:enableFlag = yes,企业状态是否为试用或正式
  3. 3.带着查询条件到数据库中查找
  4. 4.将查询出的po对象转为vo对象
  5. 5.创建rediswebSiteKey(业务前缀 + 商家的web门店站点)
  6. 6.通过webSiteKey构建redisson的商户门店通用桶对象
  7. 7.创建redisappWebSiteKey(业务前缀 + 商户的H5web站点)
  8. 8.通过appWebSiteKey构建redisson的商户的H5通用桶对象
  9. 9.获取当前时间和过期时间的时间间隔
  10. 10.将企业站点信息对象保存到redis的商户门店和商户H5通用桶对象中

2.**addWebSiteForRedis()**添加缓存中的站点,当我们【新增】企业主体信息时调用此方法;
3.**deletWebSiteForRedis()**:移除缓存中的站点,当我们【删除、禁用】企业主体信息时调用此方法;
4.**updateWebSiteForRedis()**更新缓存中的站点,当我们【修改禁用】企业主体信息时调用此方法

5.资源信息的功能需求及涉及的数据库表结构?

功能需求:
1.根据资源路径,标识,资源类,状态构建分页查询,资源类和状态的下拉框;批量删除和修改
2.点击资源管理,点击新增,弹出表单,有选项为系统需要注意只有父节点是资源管理,此选项才展示,用于子系统的唯一识别。
3.菜单创建此处菜单列表和平台的左侧菜单结构一致
4.dubbo服务,最重要的是资源路径,它是控制是否可以访问资源的关键,项目的结构为:请求方式 + 路径,比如:POST/basic/affix/select-by-businessld
数据库的表结构:

  1. CREATE TABLE `tab_resource` (
  2. `id` bigint(18) NOT NULL COMMENT '主键',
  3. `parent_id` bigint(18) DEFAULT NULL COMMENT '父Id',
  4. `resource_name` varchar(36) DEFAULT NULL COMMENT '资源名称',
  5. `request_path` varchar(200) DEFAULT NULL COMMENT '资源路径',
  6. `icon` varchar(20) DEFAULT NULL COMMENT '图标',
  7. `is_leaf` varchar(18) DEFAULT NULL COMMENT '是否叶子节点',
  8. `resource_type` varchar(36) DEFAULT NULL COMMENT '资源类型',
  9. `sort_no` int(11) DEFAULT NULL COMMENT '排序',
  10. `description` varchar(200) DEFAULT NULL COMMENT '描述',
  11. `system_code` varchar(36) DEFAULT NULL COMMENT '系统归属',
  12. `is_system_root` varchar(18) DEFAULT NULL COMMENT '是否根节点',
  13. `enable_flag` varchar(18) DEFAULT NULL COMMENT '是否有效',
  14. `created_time` datetime DEFAULT NULL COMMENT '创建时间',
  15. `updated_time` datetime DEFAULT NULL COMMENT '创建时间',
  16. `sharding_id` bigint(18) DEFAULT NULL,
  17. `label` varchar(200) DEFAULT NULL,
  18. PRIMARY KEY (`id`)
  19. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='资源表';

parent_id字段表示“父Id”的设置,以当前项目为例如果是资源管理的根节点,parent_id=-1,id为当前资源管理数据的id,如果是运营平台节点,parent_id为资源管理的id,id还是当前运营平台数据的id。
resource_name字段表示资源路径是请求方式及请求路径的定义
ioc字段表示资源的唯一标识定义。

6.角色信息的功能需求及涉及的数据库表结构?

运营平台系统管理员负责角色的权限及用户分配,同时赋予商家管理员对角色分配用户的权限。
根据角色名称(模糊查询),标识(精准查询),状态构建分页查询,状态的下拉框;
批量删除和修改
点击添加,选择左边的资源,建立角色和资源之间的关系。
表关系:一个角色可以拥有多个资源。