SpringSecurity从数据库中获取用户信息进行验证的案例详解

下面将为您详细讲解Spring Security从数据库中获取用户信息进行验证的攻略。

什么是Spring Security

Spring Security是一个功能强大、可高度定制的认证和授权框架,可用于保护基于Spring的Java应用程序。它提供了基于角色、用户和访问级别的身份验证和授权,以及多种身份验证选项,包括基本身份验证、OAuth和JWT等。

从数据库中获取用户信息进行验证

Spring Security提供了从数据库中获取用户信息进行认证的功能,使得用户登录时的认证可以更加灵活地进行管理。

实现从数据库中获取用户信息验证的步骤如下:

  1. 添加Spring Security依赖和数据库依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
  1. 在application.properties中配置数据库信息
spring.datasource.url=jdbc:mysql://localhost:3306/security
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  1. 创建UserDetails实体类
public class SecurityUser implements UserDetails {

    private Integer id;
    private String username;
    private String password;
    private boolean enabled;

    // ... 省略getter、setter
}
  1. 实现UserDetailsService接口
@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserService userService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userService.getByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("用户不存在!");
        }
        SecurityUser securityUser = new SecurityUser();
        securityUser.setId(user.getId());
        securityUser.setUsername(user.getUsername());
        securityUser.setPassword(user.getPassword());
        securityUser.setEnabled(user.getEnabled() == 1);
        return securityUser;
    }
}
  1. 创建WebSecurityConfigurerAdapter配置类
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }

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

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/static/**");
    }
}
  1. 编写登录页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <form action="/login" method="post">
        <div>
            <label for="username">用户名:</label>
            <input type="text" id="username" name="username" required>
        </div>
        <div>
            <label for="password">密码:</label>
            <input type="password" id="password" name="password" required>
        </div>
        <div>
            <input type="submit" value="登录">
        </div>
    </form>
</body>
</html>

示例演示

下面是两条使用Spring Security从数据库中获取用户信息进行验证的示例:

示例一:电商网站登录验证

电商网站为用户提供了注册和登录功能。用户注册后,其信息会被存储在数据库中。用户登录时,程序从数据库中获取用户信息进行验证。如果验证成功,就将用户的登录信息存储在Session中,并跳转到个人中心页面;如果验证失败,就返回登录页面并显示错误提示。

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/login")
    public String login() {
        return "login";
    }

    @PostMapping("/login")
    public String doLogin(String username, String password, HttpSession session) {
        User user = userService.getByUsername(username);
        if (user == null || !user.getPassword().equals(password)) {
            return "login";
        }
        session.setAttribute("userId", user.getId());
        return "redirect:/user/center";
    }

    @GetMapping("/user/center")
    public String center(HttpSession session, Model model) {
        Integer userId = (Integer) session.getAttribute("userId");
        if (userId == null) {
            return "login";
        }
        User user = userService.getById(userId);
        model.addAttribute("user", user);
        return "center";
    }

    // ... 省略其他方法
}

示例二:活动报名网站验证

活动报名网站允许用户报名参加、发布活动。用户登录后,其信息会被存储在数据库中。在用户报名参加活动时,程序从数据库中获取用户信息进行验证。如果验证成功,就将用户的报名信息存储在数据库中;如果验证失败,就返回登录页面并显示错误提示。

@Controller
public class ActivityController {

    @Autowired
    private ActivityService activityService;

    @Autowired
    private UserService userService;

    @GetMapping("/login")
    public String login() {
        return "login";
    }

    @PostMapping("/login")
    public String doLogin(String username, String password, HttpSession session) {
        User user = userService.getByUsername(username);
        if (user == null || !user.getPassword().equals(password)) {
            return "login";
        }
        session.setAttribute("userId", user.getId());
        return "redirect:/activity/list";
    }

    @GetMapping("/activity/register/{activityId}")
    public String register(@PathVariable Integer activityId, HttpSession session, Model model) {
        Integer userId = (Integer) session.getAttribute("userId");
        if (userId == null) {
            return "login";
        }
        Activity activity = activityService.getById(activityId);
        if (activity == null) {
            return "notfound";
        }
        User user = userService.getById(userId);
        model.addAttribute("activity", activity);
        model.addAttribute("user", user);
        return "register";
    }

    @PostMapping("/activity/register")
    public String doRegister(Integer activityId, Integer userId) {
        Activity activity = activityService.getById(activityId);
        User user = userService.getById(userId);
        if (activity == null || user == null) {
            return "notfound";
        }
        activityService.register(activity, user);
        return "redirect:/activity/list";
    }

    // ... 省略其他方法
}

以上就是使用Spring Security从数据库中获取用户信息进行验证的完整攻略,如果有疑问,请随时提出。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringSecurity从数据库中获取用户信息进行验证的案例详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java分层概念详解

    Java分层概念详解 什么是分层概念? 分层概念是软件架构中一种重要的设计思想,它将整个系统按照功能划分为多个不同的层次,每一层都有不同的工作职责和业务逻辑。每一层都可以独立进行开发和测试,而不会影响其他层的功能。同时,各个层之间通过接口交互数据,从而使得整个系统更加稳定、可靠、易于维护和升级。 一个标准的分层体系应该包含以下几个层次: 表现层(Presen…

    Java 2023年5月20日
    00
  • java教程之java程序编译运行图解(java程序运行)

    我们来详细讲解一下“java教程之java程序编译运行图解(java程序运行)”的完整攻略。 1.什么是Java程序编译 Java程序编译的过程是指将Java源代码(.java文件)编译成Java字节码(.class文件)的过程。在Java编程中,编写的源代码并不能直接运行,需要通过编译成字节码后,才能在Java虚拟机上进行执行。Java编译器可以检查代码中…

    Java 2023年5月20日
    00
  • Java多线程基本概念以及避坑指南

    下面是关于Java多线程基本概念以及避坑指南的完整攻略。 基本概念 线程 线程是操作系统执行的最小单位,它负责程序的运行。在Java中,线程的创建和使用由Thread类和Runnable接口完成。 可以通过以下方式创建线程: 继承Thread类并重写run()方法。 实现Runnable接口,并通过Thread类的构造函数将Runnable对象传递给Thre…

    Java 2023年5月19日
    00
  • 解决json串和实体类字段不一致的问题

    如果我们拿到了一串 JSON 字符串,需要用实体类进行反序列化,但是 JSON 字符串中的 key 和实体类的属性名不一致,这时就需要解决 JSON 串和实体类字段不一致的问题。 解决这个问题的方法有以下三种: 1. 使用 @JsonProperty 注解 Json 序列化和反序列化框架 Jackson 提供了注解 @JsonProperty,可以用来将实体…

    Java 2023年5月26日
    00
  • JAVA深入探究之Method的Invoke方法

    JAVA深入探究之Method的Invoke方法 在Java中,使用Method类可以描述一个方法。Method类提供了invoke()方法,可以反射调用一个方法。本文将讲解Method的invoke方法的使用方法及示例。 什么是Method的Invoke方法 Method的Invoke方法是Java中反射调用方法的主要方法。它可以调用任意一个对象的任意一个…

    Java 2023年5月26日
    00
  • 使用BufferedReader读取本地文件的操作

    以下是使用BufferedReader读取本地文件的完整攻略。大致步骤如下: 创建BufferedReader对象和FileReader对象; 使用FileReader对象读取文件,将数据存储在BufferedReader缓存中; 读取缓存中的数据,直到结束; 关闭BufferedReader对象和FileReader对象。 具体实现的代码如下: 步骤一:创…

    Java 2023年5月19日
    00
  • android通过servlet上传文件到服务器

    实现Android客户端通过Servlet上传文件到服务器可以通过如下步骤: 在Android客户端编写上传文件的代码,这里我们可以使用库Okhttp来提供网络请求和上传文件的能力。首先在gradle中添加依赖: implementation ‘com.squareup.okhttp3:okhttp:4.9.1’ 在Android客户端的代码中,编写上传文件…

    Java 2023年6月15日
    00
  • javascript获取四位数字或者字母的随机数

    当我们需要生成随机数时,可以使用JavaScript提供的Math.random()方法,并对其进行处理,可以生成指定范围内的随机数字或字母。以下是获取四位数字或字母随机数的完整攻略。 第一步:生成一个随机数 使用JavaScript内置的Math.random()方法可以生成一个0到1之间的随机小数。 const randomNumber = Math.r…

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