后台生成一个session和一组账号密码,如何使spring-security认证它们并记录session?

2、消费方模块结构如下

# 此uri借助了zuul的路由,它是由auth2自动调用的。注意,此处只能使用ip:port的方式,因为是由jwt框架自己调用,并没有像ribbon那样有服务的列表

从零开始搭建一个项目最重要的是选择一个自己熟悉的框架,此项目使用Springboot框架来构建后端结构,使用vue来构建前端页面。数据层我们常用的是Mybatis,这里我大部分使用了Mybatis-plus简化配置,在涉及到多表联合查询的时候使用了Mybatis。登录功能使用的单点登录,使用jwt作为我们的用户身份验证。引入了SpringSecurity安全框架作为我们的权限控制和会话控制。

新建功能比骄简单,就不截图了。

第一步:pom依赖导入如下

#返回json的全局时间格式 #设置单个文件上传的大小 #设置总上传文件的大小 #jwt加密使用的密钥 #jwt负载中拿到开头

上边除了数据库的配置信息之外,还配置了逻辑删除的配置、jwt的配置、文件上传的配置。端口号前端为8080,所以后端我们就设置为8001.

第三步:开启mapper接口扫描,添加分页、逻辑删除的插件

第四步:创建数据库和表

主要的表有:用户表,用户角色表、菜单表、菜单权限表、菜单表和员工表

因为是前后端分离项目,所以我们必须要有一个统一的结果返回封装

首先了解一下security的原理

1.客户端发起一个请求,进入 Security 过滤器链。


 //添加jwt 登录授权过滤器
 //添加自定义未授权和未登录的结果返回
 
 
 
 
这个配置方法用于配置静态资源的处理方式,可以使用Ant匹配规则
 //添加jwt 登录授权过滤器
 //添加自定义未授权和未登录的结果返回
 
这个配置方法是最关键的方法,也是最复杂的方法。
 
首先我们来解决用户认证的问题,用户认证分为首次登录和二次认证。
  • 首次登录认证:用户名、密码、验证码完成登录。
  • 二次token认证:请求头携带jwt进行身份认证。 
 
 
首先我们先生成验证码,我们先配置一下图片验证码的生成规则 //边框粗细度,默认为1 //验证码文本字符颜色 默认为黑色 //字体大小,默认40 //字符长度,默认为5 //字符间距 默认为2 //验证码图片宽度 默认为200 //验证码图片高度 默认为40

上边定义了图片验证码的长宽颜色等

然后我们通过控制器提供生成验证码的方法。

//获取验证码文本内容 //将验证码文本内容放入session //根据文本验证码内容创建图形验证码 //输出流输出图片,格式为jpg

因为是前后端分离的项目,我们禁用了session,所以我们将验证码放在了ServletContext中,然后以二进制流的形式将图片验证码输出。

登录成功之后,更新security登录用户对象,生成token,然后将token作为请求头返回回去,名称就叫作Authorization。我们需要在配置文件中配置一些jwt的一些信息:

#jwt加密使用的密钥 #jwt负载中拿到开头

我们去swagger里边进行测试

上边我们可以看到,我们已经登录成功,然后我们的token也可以看到。

登录成功之后前端就可以获取到token的信息,前端中我们是保存在了sessionStorage中,然后每次axios请求之前,我们都会添加上我们的请求头信息。这样携带请求头就可以正常访问我们的接口了。

我们的用户必须是存储在数据库里边,密码也是经过加密的,所以我们先来解决这个问题。这里我们使用了Security内置的BCryPasswordEncoder,里边就有生成和匹配密码是否正确的方法,也就是加密和验证的策略。因此我们需要在SecurityConfig中进行配置

因为我们登录过程中系统不是从我们数据库中获取数据的,因此我们需要重新定义这个查用户数据的过程,重写UserDetailsService接口

然后就是关于权限部分,也是security的重要功能,当用户认证成功之后,我们就知道是谁在访问系统接口,就是这个用户有没有权限去访问这个接口,要解决这个问题的话我们需要知道用户有哪些权限,哪些角色,这样security才能为我们做出权限的判断。

之前我们定义过几张表,用户、角色、菜单、以及一些关联表,一般情况下当权限粒度比较细的时候,我们通过判断用户有没有此菜单的操作权限,而不是通过角色判断。而用户和菜单不直接做关联的,是通过用户拥有哪些角色,角色拥有哪些菜单这样来获取的。

问题:我们在哪里赋予用户的权限

 我们再来整体梳理一下授权、验证权限的流程: 

      用户登录的时候识别到用户,并获取用户的权限信息

      有权限则可以访问接口,当没有权限的时候返回异常

//当前url所需角色 //判断角色是否登录即可访问的角色,此角色在CustomFilter中设置 //判断用户角色是否为url所需角色

  员工管理的接口的开发:

我们首先来开发员工管理的接口,主要功能就是实现对员工的增删改查,数据的导入和导出,分页显示和逻辑删除。

首先看一下员工的实体类:

接着在controller层编写对员工的分页显示的接口:

//创建page对象,开启分页 //调用方法的时候,底层封装,把分页所有数据封装到page里边

要实现分页查询,首先得传两个参数,当前页和每页大小(current、size)

首先开启分页,传入当前页和每页大小。

最后调用分页查询的方法。调用方法的时候底层封装,将所有分页的数据封装到page里边。

添加员工的接口就比较简单了,首先用post请求,方法中传入实体类对象,调用mybatisplus自带的添加方法.save(),返回值是boolean类型的。

在实现逻辑删除之前,我们首先看一下逻辑删除和物理删除,它们有什么区别呢?

物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据。

逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。

在我们日常开发中,为了保留数据,经常会使用逻辑删除的方式进行数据删除,下面我们就来看看逻辑删除怎么实现的吧

1.数据库的修改,添加isdelete字段:

2.实体类的修改,添加对应的字段,并添加@TableLogic注解.

0表示未删除,1表示已删除。

根据员工的id删除员工,调用service层的remove方法进行删除。

所谓批量删除就是能同时删除多个,调用mybatisplus自带的批量删除的方法

因为是删除多个,所以这里我们定义一个数组,然后调用removeByIds方法,需要注意的是,方法里边需要一个数,所以需要将数组转换成数。

使用post请求,直接调用mybatisplus自带的修改方法.updateById()通过用户的id修改用户的信息,返回值是一个boolean类型。

在实现导入导出数据之前我们需要添加相关的依赖:

添加完依赖之后需要对要导出的字段添加对应的注解:

去掉标题行,因为标题不能导入

导入数据成功之后更新数据:

//获取所有员工的数据

首先获取到所有员工的数据,然后准备导出参数,调用导出的方法。

// 获取文件名称,包含后缀 //随机生成uuid作为文件的id // 存放在这个路径下:该路径是该工程目录下的static文件下 // 放在static下的原因是,存放的是静态文件资源,即通过浏览器输入本地服务器地址,加文件 // 该方法是对文件写入的封装,在util类中,导入该包即可使用 // 接着创建对应的实体类,将以下路径进行添加,然后通过数据库操作方法写入

post请求,调用上传文件的接口

//使用流的形式下载文件

以二进制流的形式下载文件

员工管理接口的所有功能都写完了,下边我们实现一下权限管理模块。

我们先来开发菜单接口,因为它不需要通过其他的表来获取信息的。比如用户表需要关联角色表,角色表需要关联菜单表,因此菜单表的增删改是比较简单的。

获取菜单导航和权限的链接是这样的/menu,然后我们的菜单导航的json数据应该是这样的:

注意导航中有个children,也就是子菜单,是个树形结构

所以在打代码的时候一定要注意这个关系的关联,我们的Menu实体类中有一个parentId,但是没有children,因此我们可以在Menu中添加一个children

//根据用户的id查询菜单列表

根据用户的id查询菜单的信息

角色接口主要实现的功能就是对角色的增删改查和对角色分配菜单

添加角色需要注意的是,角色的统一编码,开头是以ROLE_开头的

根据角色的id删除角色

根据角色的名称查询角色

 //根据角色的名称查询角色的信息
 
根据角色的id获取菜单的id

 //根据角色id获取菜单的id
 






获取角色信息,因为我们不仅仅是在编辑角色的时候会用到这个方法,在回显关联菜单的时候也要被调用,因此我们需要把角色关联的所有菜单的id全部查询出来,也就是分配权限的功能。对应到前端,点击分配权限会弹出所有的菜单列表,然后根据角色已经关联的id回显勾选上已经关联过的,效果如下:





然后点击保存的时候,我们需要将角色的id和所有已经勾选上的菜单的id的数组一起传过来,如下:







 
首先执行删除的方法,删除角色对应的菜单,然后判断是否有对应的菜单,如果没有则执行插入的方法。
ok,角色管理到这儿就已经结束了。
 
用户管理里边有个用户关联角色的操作和角色关联菜单的操作差不多,其他的增删改查的操作也都一样,多了一个重置密码的操作。
//根据角色id获取菜单的id //根据用户名分页显示用户的信息

我要回帖

更多关于 admin密码是什么 的文章

 

随机推荐