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从数据库中获取用户信息进行验证的完整攻略,如果有疑问,请随时提出。

阅读剩余 79%

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

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

相关文章

  • Java实现各种文件类型转换方式(收藏)

    Java实现各种文件类型转换方式(收藏) 简介 在日常工作和生活中,我们常常需要将文件类型进行转换,如将文本文件转换为PDF文件、将图片文件转换为PNG文件等。Java作为一门流行的编程语言,可以利用各种开源库来实现各种文件类型的转换。在本文中,我们将介绍如何使用Java实现各种文件类型转换的方式。 1. 文本文件转换 1.1. 使用iText将文本文件转换…

    Java 2023年5月20日
    00
  • Java中List集合的深入介绍(超级推荐!)

    Java中List集合的深入介绍 1. List集合简介 List是Java集合框架中最基本,且使用频率最高的一种集合。List是有序的集合,元素可以重复,并且可以根据索引位置进行访问、添加、删除等操作。 List 是一个接口,常用的实现类包括 ArrayList, LinkedList, Vector。 2. 操作List集合的常用方法 2.1 添加元素 …

    Java 2023年5月26日
    00
  • Java中easypoi的使用之导入校验

    一、什么是easypoi EasyPoi是一套基于apache poi封装的Java Excel工具,目的是为了简化Excel操作,特别是复杂的不规则的报表格式的导出,同时实现Excel中一些特殊类型的导入导出,如图片、公式等。可以用于做POI导出和POI导入,功能非常强大。 二、导入校验的步骤 2.1 准备工作 首先,我们需要准备一个带有数据的Excel模…

    Java 2023年5月20日
    00
  • 详解用java描述矩阵求逆的算法

    详解用Java描述矩阵求逆的算法 算法概述 在线性代数中,矩阵求逆是一个很重要的问题,它在各种科学计算中发挥着关键作用。矩阵求逆也被用于解决多元线性回归等问题。 基本上所有矩阵求逆算法都是基于高斯-约旦变换(Gauss-Jordan elimination)来工作的,该算法旨在通过对原始矩阵进行顺序消元、列缩放和行交换等操作,从而生成一个沿着对角线对称的单位…

    Java 2023年5月19日
    00
  • 详解Java String字符串获取每一个字符及常用方法

    详解Java String字符串获取每一个字符及常用方法 获取每一个字符 在Java中,我们可以通过以下两种方式获取字符串中的每个字符: 1. 使用charArray方法 该方法将字符串转换为字符数组,然后遍历该数组即可获取每个字符。 示例代码如下: String str = "Hello World!"; char[] charArra…

    Java 2023年5月26日
    00
  • java网上图书商城(4)购物车模块1

    下面我就为大家详细讲解”java网上图书商城(4)购物车模块1”的完整攻略。 一、购物车模块介绍 在一个网上商城中,购物车是一个必不可少的模块,用户将要购买的商品都可以添加到购物车中,并在结算时进行一次性支付。购物车模块是一个核心的模块,也是一个比较复杂的模块。 二、购物车模块的实现 购物车模块主要分为以下几个部分: 购物车展示:将添加到购物车中的商品信息展…

    Java 2023年6月16日
    00
  • java基于servlet的文件异步上传

    Java基于Servlet的文件异步上传是一种常见的Web开发技术,本文将详细讲解其完整攻略,包括前台页面设计、后端代码编写及实现文件上传效果的示例代码。 1. 前台页面设计 在前台设计中,需要使用HTML、JavaScript和CSS完成文件上传页面。其中,HTML中主要包括file组件、上传按钮、进度条等,JavaScript控制上传进度和上传结果,CS…

    Java 2023年5月19日
    00
  • Spring+SpringMVC+MyBatis整合详细教程(SSM)

    以下是关于“Spring+SpringMVC+MyBatis整合详细教程(SSM)”的完整攻略,其中包含两个示例。 1. 前言 Spring+SpringMVC+MyBatis整合(简称SSM)是一种常用的Java Web开发框架,它将Spring、SpringMVC和MyBatis三个框架整合在一起,提供了一种灵活的方式来开发Web应用程序。本攻略将详细讲…

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