JWT+SpringSecurity 6.X 实现登录
JWT token只包含uuid ,token 解析uuid,然后某个常量加UUID 从Redis缓存查询用户信息
流程图如下

简介流程:先认证,认证没有问题,查询用户角色已经用户权限封装到登录对象,从Authentication获取登录对象,随机生成uuid ,uuid为key,
key的形式为:“login_tokens:uuid”,登录对象为value 保存redis 缓存,再把uuid 加密生成jwt token ,返回前端token。
感谢若依,感谢开源,能有这么好系统供我学习。
设计数据库,部门表,用户表,角色表,权限菜单表,用户角色表中间表,部门角色中间表,角色权限菜单表中间表
登录成功返回前端
{
"msg": "操作成功",
"code": "200",
//用户token
token:"XXXXX",
//菜单权限
"permissions": [
"system:user:resetPwd",
"system:post:list",
"monitor:operlog:export",
"monitor:druid:list",
"system:menu:query",
"system:dept:remove",
"system:menu:list",
...
"tool:gen:edit"
],
//角色权限
"roles": [
"test2",
"test1"
],
//用户信息
"user": {
"createBy": "admin",
"createTime": "2024-11-28 10:06:12",
},
//路由信息
[
{
"name": "System",
"path": "/system",
"hidden": false,
"redirect": "noRedirect",
"component": "Layout",
"alwaysShow": true,
"meta": {
"title": "系统管理",
"icon": "system",
"noCache": false,
"link": null
},
"children": [
{
"name": "User",
"path": "user",
"hidden": false,
"component": "system/user/index",
"meta": {
"title": "用户管理",
"icon": "user",
"noCache": false,
"link": null
}
},
{
"name": "Log",
"path": "log",
"hidden": false,
"redirect": "noRedirect",
"component": "ParentView",
"alwaysShow": true,
"meta": {
"title": "日志管理",
"icon": "log",
"noCache": false,
"link": null
},
"children": [
{
"name": "Operlog",
"path": "operlog",
"hidden": false,
"component": "monitor/operlog/index",
"meta": {
"title": "操作日志",
"icon": "form",
"noCache": false,
"link": null
}
},
{
"name": "Logininfor",
"path": "logininfor",
"hidden": false,
"component": "monitor/logininfor/index",
"meta": {
"title": "登录日志",
"icon": "logininfor",
"noCache": false,
"link": null
}
}
]
}
]
},
{
"name": "Tool",
"path": "/tool",
"hidden": false,
"redirect": "noRedirect",
"component": "Layout",
"alwaysShow": true,
"meta": {
"title": "系统工具",
"icon": "tool",
"noCache": false,
"link": null
},
"children": [
{
"name": "Build",
"path": "build",
"hidden": false,
"component": "tool/build/index",
"meta": {
"title": "表单构建",
"icon": "build",
"noCache": false,
"link": null
}
},
{
"name": "Gen",
"path": "gen",
"hidden": false,
"component": "tool/gen/index",
"meta": {
"title": "代码生成",
"icon": "code",
"noCache": false,
"link": null
}
},
{
"name": "Swagger",
"path": "swagger",
"hidden": false,
"component": "tool/swagger/index",
"meta": {
"title": "系统接口",
"icon": "swagger",
"noCache": false,
"link": null
}
}
]
},
{
"name": "Http://ruoyi.vip",
"path": "http://ruoyi.vip",
"hidden": false,
"component": "Layout",
"meta": {
"title": "若依官网",
"icon": "guide",
"noCache": false,
"link": "http://ruoyi.vip"
}
}
]
}
所有实体的基类
/**
* 实体基类
*
*/
@Setter
@Getter
@ToString
public class BaseEntity
{
private static final long serialVersionUID = 1L;
/** 搜索值 */
private String searchValue;
/** 创建者 */
private String createBy;
/** 创建时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/** 更新者 */
private String updateBy;
/** 更新时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/** 备注 */
@ApiModelProperty(value = "员工姓名",hidden = true)
private String remark;
/**
* 更新数据
*
*/
@ApiModelProperty(value = "员工姓名",hidden = true)
private boolean update;
/**
* 新增数据
*/
@ApiModelProperty(value = "员工姓名",hidden = true)
private boolean add;
/** 请求参数 */
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@ApiModelProperty(value = "请求参数",hidden = true)
private Map<String, Object> params;
}
部门实体
/**
* 部门表 sys_dept
*
*/
@Setter
@Getter
@ToString
public class SysDept extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 部门ID */
private Long deptId;
/** 父部门ID */
private Long parentId;
/** 祖级列表 */
private String ancestors;
/** 部门名称 */
private String deptName;
/** 显示顺序 */
private Integer orderNum;
/** 负责人 */
private String leader;
/** 联系电话 */
private String phone;
/** 邮箱 */
private String email;
/** 部门状态:0正常,1停用 */
private String status;
/** 删除标志(0代表存在 2代表删除) */
private String delFlag;
/** 父部门名称 */
private String parentName;
/** 子部门 */
private List<SysDept> children = new ArrayList<SysDept>();
}
用户实体包含角色集合,以及所属部门信息
/**
* 用户对象 sys_user
*
*/
@Setter
@Getter
@ToString
public class SysUser extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 用户ID */
private Long userId;
/** 部门ID */
private Long deptId;
/** 用户账号 */
private String userName;
/** 用户昵称 */
private String nickName;
/** 用户邮箱 */
private String email;
/** 手机号码 */
private String phonenumber;
/** 用户性别 */
private String sex;
/** 用户头像 */
private String avatar;
/** 密码 */
private String password;
/** 帐号状态(0正常 1停用) */
private String status;
/** 删除标志(0代表存在 2代表删除) */
private String delFlag;
/** 最后登录IP */
private String loginIp;
/** 最后登录时间 */
private Date loginDate;
/** 部门对象 */
private SysDept dept;
/** 角色对象 */
private List<SysRole> roles;
/** 角色组 */
private Long[] roleIds;
/** 岗位组 */
private Long[] postIds;
/** 角色ID */
private Long roleId;
}
角色实体包含权限按钮集合,每个按钮对应一个权限(system:user:add),所以角色还包含权限集合
/**
* 角色表 sys_role
*
*/
@Setter
@Getter
@ToString
public class SysRole extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 角色ID */
private Long roleId;
/** 角色名称 */
private String roleName;
/** 角色权限 */
private String roleKey;
/** 角色排序 */
private Integer roleSort;
/** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */
private String dataScope;
/** 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) */
private boolean menuCheckStrictly;
/** 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) */
private boolean deptCheckStrictly;
/** 角色状态(0正常 1停用) */
private String status;
/** 删除标志(0代表存在 2代表删除) */
private String delFlag;
/** 用户是否存在此角色标识 默认不存在 */
private bo

登录认证流程&spm=1001.2101.3001.5002&articleId=144116219&d=1&t=3&u=0620a0cf3ef6483f9ace8a40bc6bd967)
2万+

被折叠的 条评论
为什么被折叠?



