注册登录
现在采用的是,个人公众号的登录方式,很多的权限没有。
实现:
点击登录,登录页面显示二维码 + 验证码 --> 用户关注公众号,将登录页面上的验证码输入到公众号 --> 自动登录
登录流程如下:
库表设计
基于公众号的登录方式,用户登录表的设计
CREATE TABLE `user`(
`id` int(10) unsinged NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`third_account_id` varchar(128) NOT NULL DEFAULT '' COMMENT '第三方用户ID',
`user_name` varchar(64) NOT NULL DEFAULT '' COMMENT '用户名',
`password` varchar(128) NOT NULL DEFAULT '' COMMENT '密码' ,
`login_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录方式: 0-微信登录,1-账号密码登录', `deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否删除',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP COMMENT '最后更新时间' ,
PRIMARY KEY (`id`),
KEY `key_third_account_id` (`third_account_id`),
KEY `key_user_name` (`user_name`),
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户登录表';
上面冗余了 user_name,password 用户名和密码的登录方式,主要是给管理员登录后台使用的
用户首次登录之后,会在user表中插入一条数据,主要关注third_account_id这个字段,他记录的是微信开放平台返回的唯一用户id
权限管理
权限管理分为两块: 用户身份识别 + 鉴权
方案设计
用户身份识别:
现在用户身份的方案很多,我们现在采用的是最基础的、历史最悠久的方案。cookie + session方式(分布式的时候会用session + jwt)
整体流程:
服务内部身份传递:
另一个需要考虑的带你在于用户的身份如何在整个系统内传递? 对于单体架构而言,借助ThreadLocal来实现。
- 自定义Filter ,实现用户身份识别(从cookie中拿到SessionId,转userId)
- 定义全局上下文ReqlnfoContex: 将用户信息,写入全局共享的ThreadLocal中
- 在系统内,需要获取当前用户的地方,直接通过访问ReqlnfoContex上下文获取用户信息
- 请求返回前,销毁上下文中当前用户信息。
鉴权
根据用户的角色与接口权限要求进行判定,我们设计三种权限带你类型
- ADMIN : 只有管理员才能访问的接口
- LOGIN: 只有登录了才能访问的接口
- ALL: 默认,没有权限限制
我们在需要权限判定的接口上,添加上对应的权限要求,然后借助AOP来实现权限判断
- 当接口上有权限点要求时(除ALL之外)
- 首先获取用户信息,如果没有登录,则直接报403
- 对于ADMIN限制的接口,要求查看用户角色,必须为admin
库表设计
我们将用户角色信息写入用户基本信息表中,没有单独抽出一张角色表来,然后进行映射,主要是因为这个系统逻辑相对清晰,没有太复杂的角色关系,因此采用了轻量级的设计方案
CREATE TABLE user `info`(
`id`int(10) unsigned NOT NULL AUTO INCREMENT COMMENT '主键ID',
`user_id` int(10) unsigned NOT NULL DEFAULT 'O' COMMENT '用户ID',
`user_name` varchar(50) NOT NULL DEFAULT '' COMMENT '用户名' ,
`photo` varchar(128) NOT NULL DEFAULT '' COMMENT'用户图像',
`position` varchar(50) NOT NULL DEFAULT COMMENT '职位' ,
`company` varchar(50) NOT NULL DEFAULT '' COMMENT'公司',
`companyprofile` varchar(225) NOT NULL DEFAULT '' COMMENT '个人简介',
`user_role` int(4) NOT NULL DEFAULT 'O' COMMENT '0 普通用户 1 超管',
`extend` varchar(1024) NOT NULL DEFAULT '' COMMENT '扩展字段',
`ip` json NOT NULL COMMENT '用户的ip信息' ,
`deleted`tinyint(4) NOT NULL DEFAULT 'O' COMMENT '是否删除',
`create_time` timeStamp NOT NULL DEFAULT CURRENT TIMESTAMP COMMENT '创建时间
`update_time` tiMeStaMP NOT NULL DEFAULT CURRENT TIMESTAMP ON UPDATE CURRENT
TIMESTAMPPRIMARY KEY(`id`),
KEY `key user id`(`user id`)
)ENGINE=InNODB AUTO INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户个人信息表':