SpringBoot security安全认证登录的实现方法

以下是关于SpringBoot security安全认证登录的实现方法的完整攻略,包含详细步骤、示例和代码:

SpringBoot security安全认证登录的实现方法

概述

在网站或应用程序中,用户登录是非常常见的一种操作。而用户登录操作需要进行安全认证,防止非法用户的登录,保障网站或应用的安全。SpringBoot提供了基于Spring Security的安全认证框架,通过基本配置以及简单的注解就可以实现登录认证的功能。

实现步骤

下面是实现SpringBoot security安全认证登录的步骤:

  1. 在pom.xml中添加依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  1. 创建一个SecurityConfig类并初始化
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    UserDetailsService userDetailsService;

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

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
  1. 自定义UserDetailsService以及UserDetails

  2. 通过继承UserDetailsService接口,在其中实现loadUserByUsername方法来完成用户信息的查询。返回的UserDetails包含用户账号,密码以及角色/权限信息。

@Service
public class CustomUserDetailsService implements UserDetailsService {
    @Autowired
    private UserService userService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userService.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found");
        }
        return new CustomUserDetails(user);
    }
}
  • 自定义UserDetails
public class CustomUserDetails implements UserDetails {
    private User user;

    public CustomUserDetails(User user) {
        this.user = user;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        Set<Role> roles = user.getRoles();
        List<SimpleGrantedAuthority> authorities = new ArrayList<>();
        for (Role role : roles) {
            authorities.add(new SimpleGrantedAuthority(role.getName()));
            Set<Permission> permissions = role.getPermissions();
            for (Permission permission : permissions) {
                authorities.add(new SimpleGrantedAuthority(permission.getName()));
            }
        }
        return authorities;
    }

    @Override
    public String getPassword() {
        return user.getPassword();
    }

    @Override
    public String getUsername() {
        return user.getUsername();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}
  1. 创建登录页
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页</title>
</head>
<body>
<h1>登录</h1>
<form name="loginForm" action="/login" method="POST">
    <label>用户名:</label><input type="text" name="username"/><br/>
    <label>密码:</label><input type="password" name="password"/><br/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>

这里的form action为“/login”是Spring Security提供的默认登录校验地址,同时在这个页面的表单里,需要提交的参数名称必须是username和password。

  1. 测试

至此,SpringBoot security安全认证登录的实现就完成了。可以在浏览器中输入“http://localhost:8080/login”进行测试。

如果已经创建了一个名为“user”的角色,并且分配了“ADMIN”角色,并且一个用户名为“admin”、密码为“password”的用户已经被创建,那么在登陆后可以通过请求“/”或“/home”来访问所有网页,但其他网站或者URL就必须经过认证才可以访问。

示例

下面是两个关于SpringBoot security的实例:

示例1:项目初始化

$ mkdir springboot-security-demo
$ cd springboot-security-demo/
$ spring init --dependencies=web,security --package-name=com.example.springbootsecuritydemo --groupId=com.example springboot-security-demo

这将初始化一个项目,并在pom.xml添加以下部分:

  <dependencies>
    <!-- Spring Boot Web -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Security -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-test</artifactId>
      <scope>test</scope>
    </dependency>

    <!-- Test Dependencies -->
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.5.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
      <version>5.5.2</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.assertj</groupId>
      <artifactId>assertj-core</artifactId>
      <version>3.11.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-test</artifactId>
      <scope>test</scope>
    </dependency>

  </dependencies>

示例2:添加认证接口

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

  @Autowired
  UserService userService;

  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService())
      .passwordEncoder(passwordEncoder());
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
      .authorizeRequests()
        .antMatchers("/loginForm", "/registerForm", "/register", "/css/**", "/js/**").permitAll()
        .anyRequest().authenticated()
        .and()
      .formLogin()
        .loginPage("/loginForm")
        .defaultSuccessUrl("/")
        .failureUrl("/loginForm?error=true")
        .permitAll()
        .and()
      .logout()
        .logoutUrl("/logout")
        .logoutSuccessUrl("/loginForm?logout=true")
        .invalidateHttpSession(true)
        .deleteCookies("JSESSIONID")
        .permitAll();
    http.csrf().disable();
  }

  @Override
  public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/css/**", "/js/**");
  }

  public BCryptPasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
  }

  @Override
  public UserDetailsService userDetailsService() {
    return new CustomUserDetailsService(userService);
  }

}

以上是SpringBoot security安全认证登录的方法总结,实际开发中可以根据实际需求做适当调整。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot security安全认证登录的实现方法 - Python技术站

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

相关文章

  • java 使用ElasticSearch完成百万级数据查询附近的人功能

    下面是详细的“java 使用ElasticSearch完成百万级数据查询附近的人功能”的攻略: 一、准备工作 1. 安装Elasticsearch 首先需要在本地安装Elasticsearch,可以到官方网站下载并安装。也可以使用Docker进行安装。 2. 安装Elasticsearch客户端 在Java代码中使用Elasticsearch,需要引入Ela…

    Java 2023年5月20日
    00
  • Java实现新建有返回值的线程的示例详解

    针对“Java实现新建有返回值的线程”的问题,以下是一个完整的攻略: 1. 背景知识 在 Java 中,我们可以使用继承 Thread 类或实现 Runnable 接口来创建一个线程,具体的实现方法可以参考 “Java中创建线程的几种方式” 文章. 当我们创建一个线程时,如果需要在线程执行完毕后得到返回值,我们可以使用 Callable 接口,它定义了一个具…

    Java 2023年5月19日
    00
  • java组件smartupload实现上传文件功能

    下面是关于“java组件smartupload实现上传文件功能”的完整攻略,包含两个示例。 SmartUpload 简介 SmartUpload 是一个 Java 组件,能够方便地实现上传文件的功能。它提供了上传文件的基本方法,并可以使用 Java 类库自身的方法来读取这些文件。SmartUpload 支持批量上传,支持上传时的文件类型检查等功能。 Smar…

    Java 2023年5月19日
    00
  • Java自定义标签用法实例分析

    Java自定义标签用法实例分析 Java中提供了很多内置标签(如、 等),同时也支持自定义标签,通过自定义标签可以方便地实现更加复杂的功能和效果。 一、自定义标签的基本步骤 定义标签的实现类和标签处理器类(TagSupport的子类); 在web.xml中配置标签库; 在JSP页面中引入标签库,即使用<%@ taglib %>指令; 在JSP页面…

    Java 2023年6月15日
    00
  • Springboot2.6.x的启动流程与自动配置详解

    Spring Boot 2.6.x的启动流程与自动配置详解 Spring Boot是一个快速开发框架,可以帮助开发人员快速构建Web应用程序。在Spring Boot 2.6.x版本中,启动流程和自动配置得到了进一步的优化和改进。本文将介绍Spring Boot 2.6.x的启动流程和自动配置详解,并提供两个示例。 Spring Boot 2.6.x的启动流…

    Java 2023年5月15日
    00
  • Java基础知识精通二维数组的应用

    关于“Java基础知识精通二维数组的应用”的完整攻略,我将详细介绍如下: 一、了解什么是二维数组 在Java中,二维数组是指由多个一维数组组成的数组,每个一维数组又包含多个元素,相当于一个表格或矩阵。 二维数组的定义格式如下: 类型[][] 数组名 = new 类型[行数][列数]; 例如: int[][] arr = new int[3][2]; //定义…

    Java 2023年5月26日
    00
  • java中拼接字符串的5种方法效率对比

    下面我就为您详细讲解“Java中拼接字符串的5种方法效率对比”的攻略。 1. 前言 字符串是Java语言中最常用的数据类型之一,而字符串的拼接操作也是开发中经常需要用到的操作。本文将对Java中拼接字符串的5种常用方法进行效率对比。 2. String String 是Java中最基本的字符串类,它可以实现基本的字符串拼接功能。但是,由于Java语言中的字符…

    Java 2023年5月26日
    00
  • Spring依赖注入与第三方Bean管理基础详解

    Spring依赖注入与第三方Bean管理基础详解 Spring是一个企业级应用开发框架,它能够帮助开发者做到松耦合、便于测试和灵活性高的设计。其中的依赖注入和第三方Bean管理是Spring最为重要的两个特性之一,也是开发者需要掌握的基础知识。 什么是依赖注入? 依赖注入(DI,Dependency Injection)是指Spring容器将一个Bean的依…

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