实现一个前后端分离的java后端项目的流程详解以及自定义安全框架(主要讲的还是思路,而不是代码)

前言

如今的互联网,任何一个项目都离不开认证以及授权,在项目开发过程中,如何让我们在做这方面会更便捷一些,根据我的实际情况,如果是前后端分离的项目并且比较简单而且安全复杂程度不高,我会选择使用spring MVC的Interceptor(拦截器)+filterChain(过滤器链)+自定义全选注解+jwt来实现(注:我这篇博客主要讲的是授权认证的实现思路,而不是搬代码)。

实现思路

1.技术选型

Spring Boot + Spring MVC + Mybatis plus + jwt

  • spring boot 帮助我们简化整合各个框架所做的工作
  • spring mvc 帮助我们快速实现MVC架构模型
  • Mybatis plus 快速实现对数据库的访问(这边为什么选择mybatis plus 而不选择mybatis ,因为mybatis plus封装了对数据库的很多操作,比较适合中小型项目的快速开发)
  • jwt 一套出色校验身份校验方案,用来生成token(我们用户的认证与授权都是基于token的,如果不明白token的概念,就去看我的上一篇博客,讲的是授权认证的一些概念,链接地址:https://blog.csdn.net/weixin_44861708/article/details/112782174

2.环境搭建

  • 1.建一个spring boot项目
  • 2.在pom文件中引入所需要的jar包
  • 3.先写一个Controller类,然后启动项目,访问在Controller类上的资源路径,测试Spring MVC是否整合完毕
  • 4.在写一个Mapper类,测试能否访问数据库,如果可以,环境搭建基本完毕,
  • 5.目前,我们最简单的一个spring boot项目起码流程是可以跑通了。起码除了安全方面,现在完全可以写自己的业务逻辑了。

3.自定义安全框架

前置技术:

1.了解jwt

jwt:用来生成token(身份标识),该token用于存放了用户信息、用户权限以及token的过期时间
JWT生成的token由三部分组成:

  • 头部:主要设置一些规范信息,签名部分的编码格式就在头部中声明。
  • 载荷:token中存放有效信息的部分,比如用户名,用户角色,过期时间等,但是不要放密码,会泄露!
  • 签名:将头部与载荷分别采用base64编码后,用“.”相连,再加入盐,最后使用头部声明的编码类型进行编
    码,就得到了签名
2.基于token的会话技术

会话技术:用于保持客户端与服务器端的连接。

实现思路
  • 在用户进行认证(登录)时,会进行根据用户名从数据库中获取用户信息,然后,进行用户名、密码验证,如果验证成功,就使用jwt相关方法根据用户信息及权限生成token,并返回给客户端.
  • 以后客户端每次访问后端接口都要带上token(token放在请求头中),服务器端通过解析token获取用户信息及权限。(不选择cookie、session这一套会话技术,因为有的客户端不支持cookie,并且session会占据服务器端的部分内存
  • 我们做这套安全框架的意义是,进行用户的认证与授权,在接口地址暴露的情况下,也能对我们的项目起到保护作用,防止其他人恶意攻击项目。
  • 因为http是无状态协议,浏览器的上一次请求与下一次请求之间没有联系,所以我们需要使用会话技术,来保持客户端与服务器端的联系。会话技术的实现,我们采用jwt+自定义安全框架,因为要用到。
3.自定义安全框架

我将自定义安全框架的分为四个点

  • 第一点:自定义权限控制注解,权限注解加在controller层的方法上,主要用于表明调用该方法需要相应的权限,没有权限则无法调用
    • 具体实现:
      • 1.定义权限控制注解
      • 2.定义访问权限等级类
// 权限控制注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented     // 在生成javac时显示该注解的信息
@Inherited
public @interface Access {
    AccessLevel level() default AccessLevel.ALL;
}
// 访问权限等级类
// @Getter注解加上后不用自己再写get方法了
@Getter
public enum AccessLevel {
    /*
        所有均可访问
     */
    ALL(0, "all"),
    /*
        普通管理可访问
     */
    LOGIN(1, "admin");
    int code;
    String msg;

    AccessLevel( int code, String msg ) {
        this.code = code;
        this.msg = msg;
    }
}
  • 第二点: 写一个登录接口,权限级别是任何人都可以访问,根据客户端传来的用户名从数据库中获取用户信息,然后,进行用户名、密码验证,如果验证成功,就使用jwt相关方法根据用户信息及权限生成token存储到数据库并返回给客户端.

  • 第三点:定义一个过滤器并添加到过滤器链中,用来实现以下几点

    • 1.验证是否有token(是否登录)
    • 2.如果有token,与数据库中的存储的token比对
    • 3.如果成功,解析token,获取用户信息(用户信息,用户权限)权限,并将用户信息存储起来(存储是根据当前线程的线程ID来存储的)
  • 第四点:定义一个权限拦截器,在访问任何接口之前都要调用这个权限拦截器,所以我们需要重写拦截器的preHandle()方法,在该方法中获取要访问接口的注解,然后判断权限,如果判断通过就放行。

4.其他

在做完以上三步后,项目的环境搭建已基本完成,再接着就是写自己这个项目的业务逻辑以及一些优化操作,

  • 如使用Redis缓存
  • 使用spring boot cache
  • 使用rabbitMQ消息中间件等等

5.总结

一个项目的完善必然是要经过很多次迭代的,当我们在做项目的时候,不要着急,对这个项目进行分析,然后做减法操作,确定功能的优先级,把优先级低的任务先划掉,着重实现优先级高的功能,然后进行环境搭建,将优先级高的功能先写出来,然后再进行加法操作,将其他次要的功能以及新添加的功能放在项目的第二版甚至第三版等等,不断迭代最终形成一个比较完善的商业项目

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值