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日

相关文章

  • 吃透SpringMVC面试八股文

    说说你对 SpringMVC 的理解 SpringMVC是一种基于 Java 的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于Spring框架的一个模块。 它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful编程风格的请求。 什么是MVC模式? MVC的全名是Model View Control…

    Java 2023年4月20日
    00
  • 强引用的作用是什么?

    强引用是指对象之间的一种引用关系,如果一个对象被另一个对象强引用了,那么这个对象在内存中就不能被垃圾回收器回收。在实际开发中,使用强引用的场景非常多,下面对强引用的作用进行详细讲解。 强引用的作用 1. 避免对象被回收 强引用最常见的用途就是保持对象不被垃圾回收器回收。如果一个对象被多个地方引用着,那么可以使用强引用来确保这个对象一直存在于内存中。比如,在A…

    Java 2023年5月10日
    00
  • php UEditor百度编辑器安装与使用方法分享

    PHP UEditor百度编辑器安装与使用方法分享 什么是PHP UEditor百度编辑器? PHP UEditor百度编辑器是一个基于JavaScript的所见即所得富文本编辑器,能够在Web浏览器中编辑HTML文本和其他富媒体,如照片和视频。它是一个轻量级、高度定制的编辑器,非常适合PHP开发人员集成到他们的网站中。 安装PHP UEditor百度编辑器…

    Java 2023年6月15日
    00
  • Java异常继承结构解析_动力节点Java学院整理

    Java异常继承结构解析 异常概述 在Java语言中,异常分为两种:检查异常和非检查异常。 检查异常,也叫已检查异常,是指Java编译器在编译时会检查的异常,而且这种异常要么被捕获,要么被声明抛出。 非检查异常,也叫未检查异常,是指Java编译器不检查的异常。这种异常通常是由程序逻辑而不是语法错误引起的,比如空指针异常、类型转换异常等。 Java中的所有异常…

    Java 2023年5月26日
    00
  • ASP开发中存储过程应用全接触

    ASP开发中存储过程应用全接触 什么是存储过程? 在数据库中,存储过程是一组为了完成特定任务的SQL语句集合。存储过程可以接收数据、处理数据并返回数据,它可以调用其他存储过程、控制逻辑、计划任务和其他编程构造。存储过程可以显著提高数据库的性能,同时也具备一些安全性和封装性方面的优势。在ASP开发中使用存储过程,可以使代码结构更清晰,可维护性更高,同时也能提高…

    Java 2023年6月16日
    00
  • idea 与 maven 使用过程中遇到的问题及解决方案

    为了能够更好地回答这个问题,我先介绍一下Markdown格式,以便于后续回答过程中的展现。 一级标题 二级标题 三级标题 加粗 斜体 无序列表 无序列表 有序列表 有序列表 引用 代码块 //代码块(加入语言标识) public static void main(String[] args) { System.out.println("Hello,…

    Java 2023年6月2日
    00
  • Java中的ClassNotFoundException是什么?

    ClassNotFoundException是Java中的一种异常类型,表示虚拟机在试图加载类时无法找到指定的类。 当Java虚拟机无法找到某个类时,会抛出ClassNotFoundException异常。通常情况下,这种情况发生在以下几种情形中: 使用Class.forName()方法加载类时,指定的类不存在; 使用ClassLoader.loadClas…

    Java 2023年4月27日
    00
  • SpringDataJpa:JpaRepository增删改查操作

    针对“SpringDataJpa:JpaRepository增删改查操作”的完整攻略,我将分步骤进行讲解,并且提供两个具体的示例供参考。 1. 引入依赖 使用SpringDataJpa需要引入spring-boot-starter-data-jpa依赖: <dependency> <groupId>org.springframewor…

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