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日

相关文章

  • IDEA不编译除了.java之外的文件的解决办法(推荐)

    IDEA不编译除了.java之外的文件的解决办法(推荐) 在使用IntelliJ IDEA 进行项目开发时,我们可能会遇到只编译 Java 文件,而不编译其他文件的问题,这可能会导致一些问题出现。此时,我们需要采取一些措施来解决这个问题。 解决方案 解决方案有很多种,主要有三种: 方案一 打开IntelliJ IDEA设置,找到Compiler,在其中找到C…

    Java 2023年5月26日
    00
  • 基于JDK8总结java中的interrupt

    基于JDK8总结java中的interrupt interrupt是Java中多线程编程中用来中断线程的机制,通过interrupt方法,可以将线程置于一个中断的状态中,线程可以根据自己的业务逻辑来决定如何响应这个中断。 interrupt的实现机制 在Java中,interrupt机制的实现是基于一个boolean类型的标记,这个标记被称作中断状态标记(I…

    Java 2023年5月26日
    00
  • Java使用正则表达式提取XML节点内容的方法示例

    下面是详细讲解“Java使用正则表达式提取XML节点内容的方法示例”的完整攻略。 正则表达式提取XML节点内容的原理 在XML文件中,我们通常可以使用节点标记(例如””和””)来标识节点的开始和结束位置,因此可以利用正则表达式来匹配节点标记以提取节点内容。例如,如果我们要提取一个名为”title”的节点的内容,我们可以使用以下正则表达式: <\s*ti…

    Java 2023年5月26日
    00
  • 三种Java求最大值的方法

    当我们在Java中处理数据时,经常需要找到一组数据中的最大值。本文将介绍三种Java求最大值的方法: 方法一:将数组转换为 List,使用 Collections.max() 方法 这种方法主要是针对数组中的元素进行比较,使用了Java提供的工具类 Collections 中的max()方法,并将数组转换成List类型。具体实现代码如下: import ja…

    Java 2023年5月26日
    00
  • Java 生成随机字符的示例代码

    生成随机字符可以使用Java中的Random类和StringBuilder类。Random类是Java中的随机数生成器,StringBuilder类用于构建字符串。 下面是生成随机字符的示例代码: import java.util.Random; public class RandomStringGenerator { private static fina…

    Java 2023年5月27日
    00
  • SpringAOP 构造注入的实现步骤

    Spring AOP中的“构造注入”是一种依赖注入的方式。它通过将一个切面对象构造函数的参数注入目标对象来实现。下面是Spring AOP中构造注入的实现步骤: 定义切面类,该类必须实现一个切面接口。其中至少有一个构造函数,并将目标对象作为参数。例如: public class SecurityAspect implements Aspect { priva…

    Java 2023年5月19日
    00
  • JSP中Servlet的Request与Response的用法与区别

    JSP中Servlet的Request和Response是非常重要的概念,它们通过HttpServletRequest和HttpServletResponse来实现。在JSP中,Servlet对象是默认创建而且被调用的,因此学习Servlet的Request和Response对于理解JSP的数据交互和页面跳转非常重要。 一、Servlet Request S…

    Java 2023年6月15日
    00
  • SpringBoot为啥不用配置启动类的实现

    在Spring Boot中,我们不需要显式地配置启动类的实现,因为Spring Boot框架已经为我们提供了默认的实现。本文将详细讲解Spring Boot为什么不用配置启动类的实现,并提供两个示例。 1. Spring Boot的自动配置 Spring Boot框架提供了自动配置的功能,它会根据应用程序的依赖关系和配置文件中的配置信息,自动配置应用程序的各…

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