下面就为您详细讲解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/>
密 码:<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技术站