SpringBoot2.7 WebSecurityConfigurerAdapter类过期配置

下面就为您详细讲解SpringBoot 2.7版本中WebSecurityConfigurerAdapter类过期配置的完整攻略。

1. WebSecurityConfigurerAdapter类过期原因

在SpringBoot2.7版本中,WebSecurityConfigurerAdapter类的configure(HttpSecurity http)方法被标记为@Deprecated(过期)。原因是SpringBoot团队在最新的安全性方案中对于HttpSecurity类提供了一个更高效的配置方式。

2. WebSecurityConfigurerAdapter类过期的配置方法

在SpringBoot2.7版本中,推荐使用以下方式对HttpSecurity进行配置:

2.1 配置HttpSecurity

使用以下代码创建一个WebSecurityConfigurerAdapter的内部类,并通过@EnableWebSecurity注解来启用Web安全性:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 具体配置代码
    }
}

在configure(HttpSecurity http)方法中,您可以使用以下代码进行具体的配置:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/public/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login").permitAll()
            .and()
            .logout().permitAll();
}

上面的代码表示只有认证通过的用户才能访问除了/public/**的所有资源,登录页面为/login,注销请求是"/logout"。

2.2 配置Security

使用以下代码创建WebSecurityConfigurerAdapter的内部类,并通过@EnableWebSecurity注解来启用Web安全性:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 具体配置代码
    }
}

在configure(AuthenticationManagerBuilder auth)方法中,您可以使用以下代码进行身份验证:

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

3. 示例说明

下面给出两个示例:

3.1 配置HttpSecurity

假设现在有一个控制器,上面标记了@RequestMapping注解,我们希望只有通过身份认证的用户才能访问该控制器,否则会重定向到登录页面。

  • 第一步:创建SecurityConfig类并启用Web安全性:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/hello/**").authenticated()
            .anyRequest().permitAll()
            .and()
            .formLogin()
            .loginPage("/login")
            .defaultSuccessUrl("/hello")
            .failureUrl("/login?error")
            .permitAll()
            .and()
            .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/login")
            .permitAll();
    }
}
  • 第二步:编写Controller
@Controller
public class HelloWorldController {

    @GetMapping("/hello")
    public String helloWorld() {
        return "hello";
    }
}
  • 第三步:编写登录页面
<!DOCTYPE html>
<html>
<head>
    <title>登录页面</title>
</head>
<body>
    <h1>登录</h1>
    <div th:if="${param.error}">
        用户名或密码错误,请重新尝试。
    </div>
    <form th:action="@{/login}" method="post">
        用户名:<input type="text" name="username"/><br/>
        密&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"/><br/>
        <input type="submit" value="登录"/>
    </form>
</body>
</html>

如果用户输入正确的用户名和密码,系统就会跳转到hello页面,否则就会重定向到登录页面。

3.2 配置AuthenticationManagerBuilder

假设现在有一个web服务需要进行身份验证,我们希望使用内存身份验证来完成这项工作。

  • 第一步:创建SecurityConfig类并启用Web安全性:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user")
            .password("{noop}user")
            .roles("USER")
            .and()
            .withUser("admin")
            .password("{noop}admin")
            .roles("USER", "ADMIN");
    }
}
  • 第二步:创建控制器
@RestController
public class HelloWorldController {

    @GetMapping("/hello")
    public String helloWorld() {
        return "hello world";
    }
}
  • 第三步:测试

使用curl命令对服务进行测试:

curl -u user:user http://localhost:8080/hello

如果身份验证成功,服务将返回"hello world",否则会返回401 Unauthorized。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot2.7 WebSecurityConfigurerAdapter类过期配置 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • SpringBoot整合java诊断工具Arthas解读

    SpringBoot整合java诊断工具Arthas解读 简介 Arthas是一款阿里开源的Java诊断工具,它可以帮助开发者找到应用运行过程中的问题,定位性能瓶颈,进行动态代码修改等。本攻略将介绍如何在SpringBoot项目中使用Arthas进行诊断调试。 步骤 1. 导入依赖 在SpringBoot项目的pom.xml中添加arthas依赖,如下所示:…

    Java 2023年5月19日
    00
  • Java实现深度优先搜索(DFS)和广度优先搜索(BFS)算法

    Java实现深度优先搜索(DFS)和广度优先搜索(BFS)算法 深度优先搜索(DFS)和广度优先搜索(BFS)算法是常用的遍历和搜索算法,具有很高的实用价值。在Java中,我们可以通过使用递归函数和队列这两种数据结构来实现这两种算法。下面将对这两种算法进行详细的讲解。 深度优先搜索(DFS) 深度优先搜索(DFS)是一种常用的遍历算法,其思想就是从起点开始,…

    Java 2023年5月19日
    00
  • 使用idea搭建一个spring mvc项目的图文教程

    下面是使用Idea搭建一个Spring MVC项目的详细攻略。 安装Idea:首先,我们需要安装Idea开发工具。可以去JetBrains官网下载最新版的Idea,并安装配置。 创建一个Maven项目:在Idea中选择File -> New -> Project,然后选择Maven项目模板。 配置pom.xml:在Maven项目中,pom.xml…

    Java 2023年5月19日
    00
  • 在Java中按值调用和按引用调用

    在Java中,传递参数时有两种方式:按值传递和按引用传递。这两种方式有着不同的使用场景和特点,需要进行深入的探讨。 按值传递 在Java中,按值传递是指将数据(即变量的值)复制一份传递给被调用的方法。修改被传递进方法中的值不会影响调用方法前变量的值。 下面是一个按值传递的例子: public class PassByValueExample { public…

    Java 2023年5月20日
    00
  • Spring Data JPA系列QueryByExampleExecutor使用详解

    Spring Data JPA系列QueryByExampleExecutor使用详解 简介 Spring Data JPA 是 Spring Data 的一个模块,它通过 JPA 技术为程序开发人员提供了方便、快捷的持久化支持。Query By Example(QBE)是 Spring Data JPA 模块中的一部分,允许您根据已知的实体对象创建查询样例…

    Java 2023年5月20日
    00
  • 深入分析Java异常

    深入分析Java异常攻略 了解Java异常 Java中的异常是指程序在执行过程中出现了错误,导致程序无法继续执行或者执行结果不正确的情况。Java使用异常来处理这些错误,使程序能够更好地处理错误情况并提供更好的用户体验。Java中的异常分为两类:检查异常和非检查异常。 检查异常 检查异常是指在编译时就可以检测到的异常,程序在编译时必须显式地处理这些异常。常见…

    Java 2023年5月26日
    00
  • 什么是线程同步?

    以下是关于线程同步的完整使用攻略: 什么是线程同步? 线程同步是指多个线程之间的协作同步,以避免出现数据不一致或者数据污染的问题。在多线程编程中,多个线程同时访问共享,就会出现数据不一致或者数据污染的问题,因此需要使用线程同步机制保证数据的一致性。 为了实现线程同步,可以采取以下措施: 1. 使用 synchronized 关键字 synchronized …

    Java 2023年5月12日
    00
  • Java 对象在 JVM 中的内存布局超详细解说

    来看一下Java对象在JVM中的内存布局超详细解说的完整攻略。 概述 在Java中,对象是通过new关键字来创建的。当创建对象时,JVM会在堆(heap)中分配一块连续的内存空间,用来存储该对象的实例变量。这个连续的内存空间被称为Java对象的实例数据。 Java对象在JVM中的内存布局主要可以分为以下三个部分: 对象头(Object Header):对象头…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部