Spring Boot 中的认证是什么,如何使用

news2024/11/27 8:29:41

Spring Boot 中的认证是什么,如何使用

在 Web 应用程序中,认证是一项重要的安全措施。Spring Boot 提供了丰富的认证机制,可以帮助我们轻松地实现各种认证需求。本文将介绍 Spring Boot 中的认证是什么,以及如何使用 Spring Boot 实现认证功能。

在这里插入图片描述

认证是什么

认证是指验证用户身份的过程。在 Web 应用程序中,认证通常需要用户提供用户名和密码,以便验证用户身份的正确性。认证可以保护应用程序不受未授权的访问,从而保护用户的敏感信息和应用程序的安全。

Spring Boot 中的认证机制

Spring Boot 提供了多种认证机制,可以根据不同的需求选择合适的认证方式。常见的认证方式包括:

基于表单的认证

基于表单的认证是一种常见的认证方式,用户需要提供用户名和密码,认证成功后才能访问受保护的资源。Spring Boot 提供了一些默认的表单认证配置,可以通过配置文件进行自定义配置。例如:

spring:
  security:
    user:
      name: user
      password: password
    # or
    # users:
    #   user:
    #     password: password
    #     roles: USER
    #   admin:
    #     password: password
    #     roles: ADMIN,USER

上面的配置中,我们定义了一个用户 “user”,密码为 “password”,并赋予该用户 ROLE_USER 角色。在访问受保护的资源时,用户需要提供正确的用户名和密码才能通过认证。

基于 OAuth2 的认证

OAuth2 是一种常见的授权框架,可以用于保护 Web 应用程序中的 API。Spring Boot 提供了一些默认的 OAuth2 认证配置,可以通过配置文件进行自定义配置。例如:

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            clientId: <client-id>
            clientSecret: <client-secret>
            scope:
            - email
            - profile
        provider:
          google:
            authorizationUri: https://accounts.google.com/o/oauth2/v2/auth
            tokenUri: https://www.googleapis.com/oauth2/v4/token
            userInfoUri: https://www.googleapis.com/oauth2/v3/userinfo
            userNameAttribute: sub

上面的配置中,我们定义了一个名为 “google” 的 OAuth2 客户端,使用 Google 提供的授权服务验证用户身份。在访问受保护的 API 时,用户需要提供正确的 OAuth2 令牌才能通过认证。

基于 JWT 的认证

JWT(JSON Web Token)是一种常见的认证方式,可以用于保护 Web 应用程序中的 API。Spring Boot 提供了一些默认的 JWT 认证配置,可以通过配置文件进行自定义配置。例如:

spring:
  security:
    jwt:
      secret: <jwt-secret>
      expiration: 86400000

上面的配置中,我们定义了一个 JWT 认证的密钥和过期时间。在访问受保护的 API 时,用户需要提供正确的 JWT 令牌才能通过认证。

如何使用 Spring Boot 实现认证功能

在 Spring Boot 中,我们可以使用 Spring Security 框架实现各种认证需求。Spring Security 是一个强大的安全框架,可以帮助我们轻松地实现认证和授权功能。下面是一个使用 Spring Security 实现基于表单认证的示例:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login") // 登录页面
                .defaultSuccessURL("/home") // 登录成功后跳转的页面
                .permitAll()
                .and()
            .logout()
                .logoutUrl("/logout") // 退出登录的 URL
                .permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("{noop}password").roles("USER");
    }
}

上面的示例中,我们定义了一个名为 “WebSecurityConfig” 的配置类,继承自 WebSecurityConfigurerAdapter。在该配置类中,我们通过重写 configure 方法来实现认证功能。具体来说,我们通过 authorizeRequests 方法来定义哪些请求需要进行认证,通过 formLogin 方法来定义登录页面和登录成功后跳转的页面,通过 logout 方法来定义退出登录的 URL。在 configure 方法中,我们还通过 configure(AuthenticationManagerBuilder auth) 方法来定义用户信息,这里我们使用 inMemoryAuthentication 方法来定义一个用户 “user”,密码为 “password”,并赋予该用户 ROLE_USER 角色。

除了基于表单认证外,我们还可以使用 Spring Security 实现基于 OAuth2 和 JWT 的认证。具体来说,我们可以使用 Spring Security OAuth2 和 Spring Security JWT 模块来实现 OAuth2 和 JWT 认证。下面是一个使用 Spring Security OAuth2 实现认证的示例:

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients
            .inMemory()
                .withClient("<client-id>")
                .secret("{noop}<client-secret>")
                .authorizedGrantTypes("authorization_code", "refresh_token")
                .scopes("read", "write")
                .redirectUris("<redirect-uri>");
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints
            .authenticationManager(authenticationManager);
    }
}

上面的示例中,我们定义了一个名为 “OAuth2AuthorizationServerConfig” 的配置类,继承自 AuthorizationServerConfigurerAdapter。在该配置类中,我们通过 configure(ClientDetailsServiceConfigurer clients) 方法来定义 OAuth2 客户端信息,使用 inMemory 方法来定义客户端 ID 和密钥,并指定授权类型和作用域。在 configure(AuthorizationServerEndpointsConfigurer endpoints) 方法中,我们还需要指定认证管理器,这里我们使用 @Autowired 注解注入 authenticationManager,以便进行用户认证。

除了 OAuth2 认证外,我们还可以使用 Spring Security JWT 模块来实现 JWT 认证。下面是一个使用 Spring Security JWT 实现认证的示例:

@Configuration
@EnableWebSecurity
public class JWTSecurityConfig extends WebSecurityConfigurerAdapter {
    @Value("${jwt.secret}")
    private String secret;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .addFilter(new JWTAuthenticationFilter(authenticationManager(), secret))
            .addFilter(new JWTAuthorizationFilter(authenticationManager(), secret))
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
            .csrf().disable();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("{noop}password").roles("USER");
    }
}

上面的示例中,我们定义了一个名为 “JWTSecurityConfig” 的配置类,继承自 WebSecurityConfigurerAdapter。在该配置类中,我们通过 configure(HttpSecurity http) 方法来定义哪些请求需要进行认证,并添加 JWTAuthenticationFilter 和 JWTAuthorizationFilter 过滤器。在 configure 方法中,我们还通过 configure(AuthenticationManagerBuilder auth) 方法来定义用户信息,这里我们使用 inMemoryAuthentication 方法来定义一个用户 “user”,密码为 “password”,并赋予该用户 ROLE_USER 角色。需要注意的是,我们还需要定义一个 secret,用于生成和验证 JWT 令牌。

总结

认证是 Web 应用程序中的一项重要安全措施,可以保护用户的敏感信息和应用程序的安全。Spring Boot 提供了多种认证机制,可以根据不同的需求选择合适的认证方式。常见的认证方式包括基于表单认证、基于 OAuth2 认证和基于 JWT 认证。我们可以使用 Spring Security 框架来实现各种认证需求,Spring Security 是一个强大的安全框架,可以帮助我们轻松地实现认证和授权功能。

在使用 Spring Security 实现认证时,我们需要定义一个配置类来配置安全策略。在配置类中,我们可以使用 authorizeRequests 方法来定义哪些请求需要进行认证,使用 formLogin 方法来定义登录页面和登录成功后跳转的页面,使用 logout 方法来定义退出登录的 URL。在 configure(AuthenticationManagerBuilder auth) 方法中,我们还需要定义用户信息,指定用户的用户名、密码和角色。

对于基于 OAuth2 的认证,我们需要使用 Spring Security OAuth2 模块来实现。在配置类中,我们需要定义一个 AuthorizationServerConfigurerAdapter 类,通过 configure(ClientDetailsServiceConfigurer clients) 方法来定义 OAuth2 客户端信息,通过 configure(AuthorizationServerEndpointsConfigurer endpoints) 方法来指定认证管理器。在使用 OAuth2 认证时,我们还需要使用 OAuth2 客户端来获取 OAuth2 令牌,通过令牌来访问受保护的资源。

对于基于 JWT 的认证,我们需要使用 Spring Security JWT 模块来实现。在配置类中,我们需要定义一个 secret,用于生成和验证 JWT 令牌。在 configure(HttpSecurity http) 方法中,我们需要添加 JWTAuthenticationFilter 和 JWTAuthorizationFilter 过滤器,以便进行用户认证和授权。

综上所述,Spring Boot 提供了丰富的认证机制,可以帮助我们轻松地实现各种认证需求。在使用 Spring Security 实现认证时,我们需要定义一个配置类来配置安全策略,并根据不同的认证方式进行相应的配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/724260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023上半年软考系统分析师科目一整理-16

2023上半年软考系统分析师科目一整理-16 信息系统的性能评价指标是客观评价信息系统性能的依据&#xff0c;其中&#xff0c;&#xff08; &#xff09;是指系统在单位时间内处理请求的数量。 A.系统响应时间 B.吞吐量 C.资源利用率 D.并发用户数 运用互联网技术&#xff0c;在…

软件工程——第7章实现知识点整理

本专栏是博主个人笔记&#xff0c;主要目的是利用碎片化的时间来记忆软工知识点&#xff0c;特此声明&#xff01; 文章目录 1.实现由哪两个部分组成&#xff1f; 2.编码是什么&#xff1f;所选用的程序设计语言对程序的哪些特性有着深远影响&#xff1f; 3.软件测试在软件生…

旅游卡系统招募城市合伙人

旅游业的不断发展&#xff0c;旅游卡系统作为一种新型的旅游消费模式也逐渐被越来越多的人所认可。现在&#xff0c;许多旅游卡系统开始招募城市合伙人&#xff0c;以进一步拓展其市场。 旅游卡系统是一种可以将不同景区、景点门票进行整合&#xff0c;并提供折扣优惠的旅游…

谈谈mysql——Binlog的复制方式和解析技巧

mysql 我们先来看一下MySQL的基本架构&#xff0c;从大的方面来讲&#xff0c;一个server层&#xff0c;一个引擎层。server层就像一个接口&#xff0c;可以对接任何符合规定的引擎。具体的细节可以参考我之前写过的文章mysql的这些坑你踩过吗&#xff1f;快来看看怎么优化mys…

vue3+pinia用户信息持久缓存(token)的问题

vue3pinia用户信息持久缓存&#xff08;token)的问题 对博主来说&#xff0c;这是个相当复杂的问题。 当初在使用vue2vuex进行用户信息持久登录时&#xff0c;写了不下3篇博客&#xff0c;确实是解决了问题&#xff0c;博客链接如下 vue存储和使用后端传递过来的tokenvue中对…

动态规划之 509斐波那契数(第1道)

目录 题目&#xff1a;斐波那契数 &#xff08;通常用 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。 解法&#xff1a; 动态规划法&#xff1a; 题目&#xff1a;斐波那契数 &#xff08;通常用…

大象机器人人工智能套装2023版深度学习协作机器人、先进机器视觉与应用场景

引言&#xff1a; 介绍当前的版本 今天我们要介绍的是aikit2023&#xff0c;aikit2023是aikit的全新升级版。 AIkit 2023 是一套集视觉&#xff0c;定位抓取、自动分拣模块为一体的入门级人工智能套装。 该套装基于python平台&#xff0c;可通过开发软件实现机械臂的控制&am…

gitee提交项目失败记录:remote:error:hook declined to update refs/heads/master

问题描述&#xff1b; 今天修改了项目里面一些文件内容&#xff0c;结果提交的时候报错了&#xff0c;可以提交到本地仓库&#xff0c;但提交到中央仓库报如下异常&#xff0c;因此记录下&#xff0c;防止后面再遇到…… 解决办法&#xff1a; 登录gitee账号&#xff0c;在设置…

自定义MVC的进阶使用

文章目录 前言一、环境配置1.1 将框架打包成jar包1.2 将Jar包导入新项目1.3 将分页标签相关文件、及相关助手类导入1.4 配置文件 二、前后台编写2.1 实体类2.2 dao2.3 Servlet2.4 配置mvc.xml2.5 JSP2.6 运行结果 前言 通用增删改查、通用分页、XML解析反射建模&#xff0c;包…

【网络安全带你练爬虫-100练】第6练:内嵌发包提取数据

目录 一、分析目标&#xff1a; 二、代码实现 目标1&#xff1a;对于捕获的URL内嵌发包 目标2&#xff1a;找到电话和邮箱的位置 目标3&#xff1a;提取电话和邮箱 三、完整代码 四、网络安全小圈子 &#xff08;注&#xff1a;需要带上登录成功后的cookie发包&#xff…

Nginx部署前后端分离项目

dev.env.js解释 //此文件时开发环境配置文件 use strice//使用严格模式 const merge require(webpacl-merge)//合并对象 const prodEnv require(./prod.env)//导出 module.exports merge(prodEnv,{//合并两个配置文件对象并生成一个新的配置文件&#xff0c;如果合并的过程…

使用Postman做接口测试并生成接口测试报告

学习目标 1、录制脚本或使用手写url进行抓包 2、微信api接口&#xff08;可录制可手写&#xff09; 3、添加多 个标签&#xff0c;获取多个标签&#xff0c;编辑多个标签&#xff0c;删除多个标签&#xff01;&#xff01;&#xff01;&#xff08;csv格式&#xff09; 4、通过…

Java JDK 安装及环境配置教程

一、安装 1、安装包 jdk1.8安装包下载路径 2、创建一个英文的文件夹 注意&#xff1a;整个路径不要有中文、建议文件夹直接命名为JDK。 3、在该文件夹下创建两个空文件夹&#xff0c;分别为&#xff1a;jdk1.8 和 jre 其中jdk1.8 是我的JDK版本&#xff0c;这个可以自行改变。…

宝塔 安装/使用Jenkins-图文小白教程

一、Jenkins包下载 大家可以从Jenkins官网&#xff08;https://www.jenkins.io/&#xff09;根据自己的需要下载最新的版本。 但Jenkins官网下载较慢&#xff0c;容易造成下载失败。可以去国内的开源镜像网站下载Jenkins最新版本。目前博主使用的是清华大学的开源镜像网站&…

【spring创建对象方式】 and 【Java创建对象方式】

Spring创建对象方式 通过构造函数创建对象&#xff0c;通过静态工厂方式创建对象&#xff0c;通过实例工厂方式创建对象 1、通过构造函数创建对象 无参构造函数&#xff1a; 最基本的对象创建方式&#xff0c;只需要有一个无参构造函数&#xff08;类中没有写任何的构造函数…

excel 复制出来的数据内容自动带上空格

在excel中批量处理完了公式&#xff0c;想复制到navicat 或者文本编辑框里&#xff0c;发现都会自动带上双引号&#xff0c;但是excel 里是没有&#xff0c;查找了半天。 在excel里的文本如下所示 拷贝出来的结果如下所示&#xff1a; 经过检查发现原文中只要带有回车或者换行…

A40i Linux3.10开发板移植高精度定时器hrtimer驱动

目录 整编内核 修改Makefile文件 编译内核 生成.ko文件 应用层调用 这里使用整个编译内核的方式编译.ko文件。 整编内核 编写一个hrtimer_demo.c的驱动程序源码如下&#xff1a; #include <linux/module.h> #include <linux/kernel.h> #include <linux/i…

相机图片给 Livox 激光雷达点云赋色(python代码 单文件)

需要配置PCD文件路径, 图片路径,相机内参,相机和雷达的外参; 单文件, Windows , liunx 都可以运行。 雷达和相机外参如何标定请看我的另外一篇标定的代码文章。 效果如下图: 附上代码: # coding:utf-8import cv2 import numpy as np import open3d as o3ddef get_U…

记录一次在泛微OA中添加js代码块,限制开始日期时间不能大于等于结束日期时间

目标&#xff1a; 在选择流程后提交时&#xff0c;选择的开始日期、时间不能大于结束日期、时间选择的开始日期、时间不能等于结束日期、时间满足以上条件才可以提交 效果图&#xff1a; 在OA后台添加js代码的步骤&#xff0c;如下&#xff1a; 图一&#xff08;第1-5步参考图…

[NPUCTF2020]你好sao啊

前言 base64的解密算法&#xff0c;开始还以为是什么变种加密手段 分析 可以发现加密区域主要位于RxEncode中&#xff0c;最终结果为s中保存数据 解密算法写的有点怪怪的&#xff0c;知道是4转3但给人1的感觉不像是在解密&#xff0c;更像是在换表之类的操作 strchr的作用为…