Spring Security - 内存中身份验证
Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。它是保护基于 Spring 的应用程序的事实标准。 Spring Security 是一个专注于为Java应用程序提供身份验证和授权的框架。与所有 Spring 项目一样,Spring Security 的真正强大之处在于它可以轻松扩展以满足自定义需求。 Spring Security 的一些关键特性是:
- 对身份验证和授权的全面且可扩展的支持
- 防止会话固定、点击劫持、跨站点请求伪造等攻击
- Servlet API 集成
- 与 Spring Web MVC 的可选集成。
我们先来讨论一下 Spring Security 的基本简单认证。在 Simple authentication 中,Spring Security 提供了一个默认的用户名和密码,我们必须使用它来进行有效的身份验证。
XML
org.springframework.boot
spring-boot-starter-security
org.springframework.boot
spring-boot-starter-web
Java
@RestController
public class controller {
@GetMapping("/delete") public String delete()
{
return "This is the delete request";
}
}
Java
package com.example.SpringBootApp;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@EnableWebSecurity
public class config extends WebSecurityConfigurerAdapter {
// Adding the roles
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("Zack")
.password("aayush")
.roles("admin_role")
.and()
.withUser("GFG")
.password("Helloword")
.roles("student");
}
// Configuring the api
// according to the roles.
@Override
protected void configure(HttpSecurity http) throws Exception {
http.
httpBasic()
.and()
.authorizeRequests()
.antMatchers("/delete").hasRole("admin_role")
.antMatchers("/details").hasAnyRole("admin_role","student")
.and()
.formLogin();
}
// Function to encode the password
// assign to the particular roles.
@Bean
public PasswordEncoder getPasswordEncoder(){
return NoOpPasswordEncoder.getInstance();
}
}
Spring Security 简单认证登录页面:
密码:
这个密码很难记住,因为这是一个随机密码,而 Spring Security 每次执行 Spring Application 时都会生成一个随机密码。如果我们想在 Spring 应用程序中添加自定义用户名和密码以进行身份验证,我们可以轻松添加它(使用 application.properties ),但如果我们想为多个用户创建 Spring 应用程序,则很难配置他们的凭据。因此,当我们处理多个身份验证及其各自的角色时,要克服这种情况。我们将在 Spring 应用程序中使用内存中身份验证。
内存中身份验证是 Spring Security 中处理身份验证的方式。在内存认证中,我们硬核了所有用户详细信息,例如角色、密码和用户名。我们可以在 Spring 服务器运行之前执行验证。如果服务器停止,内存将被清除,我们无法执行验证。这是内存身份验证的主要缺点。
inMemoryAuthentication()是 AuthenticationManagerBuilder 类的方法,用于在 Spring Security 中执行内存认证。此方法用于创建具有相应角色和密码的用户。下面讨论如何在 Spring Security 中实现 inmemoryAuthentication。
分步实施
第 1 步:创建 Spring Boot 项目
Project: Maven
Language: Java
Spring Boot: 2.2.8
Packaging: JAR
Java: 8
Dependencies: Spring Web,Spring Security
第 2 步:单击 Generate 将下载启动项目。
项目结构:
第三步:解压压缩包。现在打开一个合适的 IDE,然后转到 File > New > Project from existing sources > Spring-boot-app 并选择 pom.xml。点击提示导入更改,等待项目同步,如下图所示:
Note: In the Import Project for Maven window, make sure you choose the same version of JDK which you selected while creating the project.
第 4 步:现在转到 src > main > Java > com.gfg.Spring.boot.app 并创建两个Java文件,一个是控制器。 Java ,另一个是配置。Java
控制器。Java
Java
@RestController
public class controller {
@GetMapping("/delete") public String delete()
{
return "This is the delete request";
}
}
上面的Java文件用于设置控制器以处理来自客户端的传入请求。现在我们必须配置我们将使用配置的请求。 Java文件。
配置。Java
此配置文件扩展了 WebSecurityConfigureAdapter 类,我们覆盖了两个方法configure(AuthenticationManagerBuilder auth)和configure(HttpSecurity Http) ,这两个方法都用于处理 Spring 应用程序上的多重身份验证。
- 第一种方法用于在 SpringApplication 的 inMemory 中添加具有各自角色的用户的凭据。
- 第二种方法用于处理 Spring 应用程序中的用户定义 API。
Java
package com.example.SpringBootApp;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@EnableWebSecurity
public class config extends WebSecurityConfigurerAdapter {
// Adding the roles
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("Zack")
.password("aayush")
.roles("admin_role")
.and()
.withUser("GFG")
.password("Helloword")
.roles("student");
}
// Configuring the api
// according to the roles.
@Override
protected void configure(HttpSecurity http) throws Exception {
http.
httpBasic()
.and()
.authorizeRequests()
.antMatchers("/delete").hasRole("admin_role")
.antMatchers("/details").hasAnyRole("admin_role","student")
.and()
.formLogin();
}
// Function to encode the password
// assign to the particular roles.
@Bean
public PasswordEncoder getPasswordEncoder(){
return NoOpPasswordEncoder.getInstance();
}
}
Note: There is no default password is generated because we have already used external configuration for handling the user credentials.
在 Postman 中测试 API
转到邮递员并输入localhost:8080/delete
使用管理员角色:
使用学生角色:尝试使用学生角色的用户名和密码访问详细信息 API。