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

yizhihongxing

以下是关于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 实战项目锤炼之医院门诊收费管理系统的实现流程

    Java 实战项目锤炼之医院门诊收费管理系统的实现流程 本文将详细讲解如何实现一个医院门诊收费管理系统。这是一个完整的实战项目,通过学习该项目,可以锤炼开发者的 Java 编程能力和项目开发能力。本文将分为以下几个部分: 总体设计 数据库设计 后端实现 前端实现 测试 总体设计 医院门诊收费管理系统需要实现的功能包括: 病人信息的管理,包括新增、修改、删除、…

    Java 2023年5月31日
    00
  • java实现文件读写与压缩实例

    Java实现文件读写与压缩实例 文件读取 Java中可以通过File类和FileInputStream类来实现文件读取。其中,File类用于表示文件对象,而FileInputStream类用于读文件的数据流。 下面是一个简单的文件读取的示例代码,读取指定路径下的txt文件: import java.io.File; import java.io.FileIn…

    Java 2023年5月20日
    00
  • java处理转义字符↑ → ↓ 保存后的展示还原操作

    Java处理转义字符的攻略 在Java中,我们经常需要处理转义字符以及它们的展示还原操作。在本文中,我们将介绍一些实现这些操作的基本方法。 转义字符的定义 转义字符是一些特殊字符,它们的字符值用于表示一些难以在文本字符集中表达的含义。在Java中,有一些常见的转义字符,如“\n”表示换行,”\t”表示制表符等。这些转义字符将在字符串中使用。 转义字符的展示 …

    Java 2023年5月27日
    00
  • JSP实用教程之简易页面编辑器的实现方法(附源码)

    首先我们先来了解一下题目中的内容: JSP实用教程之简易页面编辑器的实现方法(附源码) 该文章是一篇针对JSP编程和页面编辑器的教程,主要介绍了如何使用JSP编写一个简易的页面编辑器,同时也附有源码提供下载。 下面我们来分步骤详细讲解该教程的实现方法: 1、目标 首先,我们需要明确本篇教程的目标是什么。本篇教程要实现的是一个基于JSP的简易页面编辑器,能够实…

    Java 2023年6月15日
    00
  • JavaSpringBoot报错“NotAllowedException”的原因和处理方法

    原因 “NotAllowedException” 错误通常是以下原因引起的: 请求方法不允许:如果您的请求方法不允许,则可能会出现此错误。在这种情况下,需要检查您的请求方法并确保它们正确。 请求路径不允许:如果您的请求路径不允许,则可能会出现此错误。在这种情况下,需要检查您的请求路径并确保它们正确。 请求头不允许:如果您的请求头不允许,则可能会出现此错误。在…

    Java 2023年5月4日
    00
  • java文件处理工具类详解

    Java文件处理工具类详解 在Java编程中,我们经常涉及到文件的操作,例如读取文件、清空文件、写入文件、获取文件信息等等,如果每次都手写文件操作代码,那么非常费时费力。因此,编写一个Java文件处理工具类是很有必要的。下面,我将详细讲解如何编写一个Java文件处理工具类。 一、文件相关概念 在开始编写文件处理工具类之前,我们先来了解一些文件相关概念。 1.…

    Java 2023年5月20日
    00
  • Java中File文件操作类的超详细使用教程

    Java中File文件操作类的超详细使用教程 简介 Java中的File类是文件和目录路径名的抽象表示。File类获取的是路径名的字符串,而不是文件内容。在Java中,我们可以使用File类来进行文件的操作。其中,常用的方法包括创建文件、删除文件、重命名文件、以及创建目录等操作。 创建文件 使用File类中的createNewFile方法可以创建一个文件。其…

    Java 2023年5月20日
    00
  • Java8时间转换(LocalDateTime)代码实例

    下面我会详细讲解Java8时间转换(LocalDateTime)代码实例的完整攻略。在这个过程中,我会提供两个示例供您参考。 1. 概述 Java8中引入了新的日期类,其中包括了LocalDate和LocalDateTime。在之前的版本中,我们需要使用Calendar类来完成日期的操作,而在Java8中,可以通过LocalDateTime来完成。 Loca…

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