Spring Security JWT Authentication and Authorisation(一)

2023-10-24 08:15

本文主要是介绍Spring Security JWT Authentication and Authorisation(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Authentication (鉴权,完成用户身份的验证)

Authorisation(授权)

Security是必须的当设计和构建API,理解Spring Security和JWT很重要,你可以安全化你的API。

在开始之前, 首先解释这个JWT验证机制如何工作。整个故事开始于当客户端发送一个HTTP请求到后端系统,后端系统运行在Springboot Apache Tomcat嵌入式服务器上。

所以,仅仅对你是一个提醒,在一个Spring应用中第一件被执行的事情是Filter。每次你创建一个Filter,注意到它将是我们应用中第一件被执行的事情。在这样的情况下,第一件事情被执行的事情JWT Authentication  Filter。这仅仅是一个每个请求每次的过滤器。角色是证实和检查关于JWT token的一切。

现在,我们来开始这个过程。第一件发生的事情是我们将有一个内部检查,来检查我们是否有一个JWT Token。如果Token丢失了,我们将发送一个403请求到客户端,原因是丢失JWT。

在此之后将开始验证过程。这个验证过程将以这种方式启动,所以像这个内部执行的Filter将会首先做出一个调用使用UserDetailService来尝试从数据库中获取用户信息。基于用户Email,token主题,我们将从JWT Authentication中提炼。这个JWT Authentication域将检查JWT Token提取出Username或者是Email。我们称它为Subject当我们讨论JWT Token时,它将使用获取的Email来获取用户信息细节。

一旦我们从得到了响应到JWT Authentication Filter。我们将做一些检查。如果用户不存在,我们将返回403到使用者。如果一切正常,我们将从数据库中得到用户信息。接着我们将开始一段验证过程。因为JWT token被为了专门的用户生成。所以我们想要基于用户来验证这个token。

这里我们有Validate JWT过程或者机制,它将尝试调用JWT Service。这个JWT Service将采用User自己和Token参数。

在这个验证过程执行之后,这里我们有两个案例场景。第一,token是无效的,例如token已到期,或者这个token不是专门为了这个特定的user。我们将返回一个403返回到用户。否则,我们将更新这个SecurityContextHolder。因为当我们从数据库中获取UserDetail'信息的时候,我们将能够设置这个SecurityContextHolder。我们将告诉Spring剩下的FilterChain这个User现在被授权。

我们将更新Authentication管理器,每次我们检查用户对这个请求是否被授权时,答案将会为是。

一旦SecurityContextHolder将被更新,它将自动的发送请求。发送给Dispatcher servlet,接着被发送给Controller,我们将做所有需要的检查,例如调用Service。接着我们将返回响应,例如,它可以是一个JWT,也可能是一个HTTP状态码200。任何过程将在Controller中执行。这就是 JWT Authentication机制工作。接下来是如何实现这些,如何实现这些步骤。

start.spring.io

最小的与Springboot3兼容的Java版本是Java17。

所需要的依赖:

Spring Web

Spring Security

Spring Data JPA

PostgreSQL Driver

Lombok

现在,来建立应用和数据库的一个连接。修改application.property的文件名为application.yml。

然后需要提供一些属性,首先是url,url: jdbc:postgresql://localhost:5432/name/

连接字符串到数据库。在提供Data Source信息之后,希望给出其它的一些JPA属性。

driver-class-name: org.postgresql.Driver

这里需要告诉Spring,

ddl-auto这里有一些选择,

create-drop

create

none

update

validate

这里将使用create-drop,因为每次开始应用时,我想要创建一个新的数据库,一个新的模式。当我停止了应用时,我希望销毁它。我总是希望以空的数据库开始。

下一步,在JPA里面,你需要注意缩进。

show-sql:true,当Spring Data JPA执行一个请求时.

希望添加一些属性,

properties:
        hibernate:
                format_sql: true

我想要请求格式化。

接着提供关于数据库的一些信息,

database: postgresql

告诉JPA我们正在使用哪个数据库。

接着提供所使用的数据库平台

database-platform: org.hibernate.dialect.PostgreSQLDialect

这将帮助Spring执行和写更好的查询。

以上是配置,接下来让我们实现security。

当我们讨论 Authentication and Authorisation时,我们主要讨论的是Users。

New -> JavaClass

user.User

可以创建一个user包,在其中创建一个User类。

接着,我将添加一些Lombok注释来减少样板代码。因为当我们创建一个类时,我们需要Getters和Setters,需要constructors。

@Data注释,等同于@Getter,@Setter , @RequiredArgsConstructor,@ToString,@EqualsAndHashCode。

也使用@Builder注释。这个注释将帮助我们用一种简单的方式构建对象,使用Builder设计模式。

也需要@NoArgsConstructor和@AllArgsConstructor注释。

像这样就有了User类。现在让我们把这个User类设置为一个Entity。

为了让这个User类为一个Entity,首先我们要添加的是这个Entity注释。因为我们在使用Springbbot3。确保这里的包是jakarta.persistence,它不再是javax.persistence。

这也将会帮助你分辨是否用的是正确的版本。我们需要这个@Entity注解,因为这个User类已经被被作为PostgreSQL保留字。PostgreSQL已经有一个表称为User,所以我们不能够创建第二个称为User的表格。将使用@Table(name = "_user")注解。

有一个红色的报错,“Persistent Entity  ‘User’ should have a primary key”。

所以我们需要提供一个ID属性,@Id注解,所属的包是jakarta.persistence,它表明这个属性是类的唯一标识符。同时,我也希望这个ID是Auto  Incremented或者说Anto Generated。

每次我们想要创建User的时候,我们不需要提供这个ID。

我想要它自增。@GeneratedValue(strategy = )注解

GenerationType的种类有:

AUTO

IDENTITY

SEQUENCE

TABLE

UUID

AUTO是默认的类型。IDENTITY意味着将使用一个身份识别号,例如一个AUTO INCREMENT。

SEQUENCE表示我们将在数据库中创建一个序列,并且使用这个序列来增加。

sequence号是数据库系统按照一定规则自增的数字序列,因为自增所以不会重复。

如果你把GenerationType留为AUTO,hibernate将尝试检测对你最适合的选项。

例如,如果我们使用PostgreSQL,它将默认选择SEQUENCE。如果你使用MYSQL,它将会选择TABLE,因为MYSQL不工作在SEQUENCE下,所以它将选择TABLE。默认是AUTO。

现在,我们有了ENTITY,让我么尝试着开始应用,确保我们的表在数据库中被创建。

Lombok requires enabled annotation processing

Enable annotation processing

现在应用被启动了,让我们看一下logs。

schemas ->  public -> Tables -> _user

Spring Security开始应用时,它将使用UserDetails。UserDetails接口包含一堆方法。每次你在Spring Security上工作时,你需要确保你正在提供给这个UserDetails,来使得Spring Security易于使用。

class User implements UserDetails

继承一些接口,所以让我们实现一堆方法。

点击implement method

getAuthorities返回一系列的角色。private Role role;。我们需要添加@Enumerated注释。

这个注解会告诉Spring这是一个Enum。

EnumType类型有:

ORDINAL,意味着0,1,2。

STRING。

现在User已经完成了。接下来让我们继续为User类创建Repository。Repository是一个类,它负责与数据库交互。当在Spring Data JPA时,我们不需要创建一个类。我们需要的是创建一个Interface。

为了让它成为一个Repository,我们需要的extends JpaRepository<>

Spring Data JPA也有一堆可以使用的方法,例如save,findAll,findById等等。

现在,我想要创建一个后面需要的方法。

这个方法将尝试着通过email找到一个用户,因为email是独一无二的。

当我们在这里检查我们的架构时,从HTTP中获取的第一件事情是这个JWT鉴权过滤器。

所以我们接着来创建这个过滤器。

这篇关于Spring Security JWT Authentication and Authorisation(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/273884

相关文章

JavaWeb-WebSocket浏览器服务器双向通信方式

《JavaWeb-WebSocket浏览器服务器双向通信方式》文章介绍了WebSocket协议的工作原理和应用场景,包括与HTTP的对比,接着,详细介绍了如何在Java中使用WebSocket,包括配... 目录一、概述二、入门2.1 POM依赖2.2 编写配置类2.3 编写WebSocket服务2.4 浏

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

Java如何获取视频文件的视频时长

《Java如何获取视频文件的视频时长》文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案... 目录Java获取视频文件的视频时长1、导入maven依赖2、代码案例3、SLF4J: Failed to lo

如何使用Spring boot的@Transactional进行事务管理

《如何使用Springboot的@Transactional进行事务管理》这篇文章介绍了SpringBoot中使用@Transactional注解进行声明式事务管理的详细信息,包括基本用法、核心配置... 目录一、前置条件二、基本用法1. 在方法上添加注解2. 在类上添加注解三、核心配置参数1. 传播行为(

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例