📜  Spring Security - 内存中身份验证

📅  最后修改于: 2022-05-13 01:55:33.551000             🧑  作者: Mango

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。点击提示导入更改,等待项目同步,如下图所示:

第 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();
    }
}

在 Postman 中测试 API

转到邮递员并输入localhost:8080/delete

使用管理员角色:

使用学生角色:尝试使用学生角色的用户名和密码访问详细信息 API。