Spring Security将用户数据存储到数据库的方法

Spring Security是Spring Framework的一个模块,用于提供身份验证、授权、攻击防护等安全相关功能。Spring Security支持多种存储用户数据的方式,包括内存、JDBC、LDAP等,其中存储到数据库是最常用的方式之一。

下面给出Spring Security将用户数据存储到数据库的完整攻略,主要包含以下步骤:

1. 引入Spring Security依赖

在项目的pom.xml中添加Spring Security的依赖:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>5.5.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.5.1</version>
</dependency>

2. 创建用户表

Spring Security默认使用以下表结构存储用户数据:

CREATE TABLE users(
  username VARCHAR(50) PRIMARY KEY,
  password VARCHAR(100) NOT NULL,
  enabled BOOLEAN NOT NULL
);

CREATE TABLE authorities (
  username VARCHAR(50) NOT NULL,
  authority VARCHAR(50) NOT NULL,
  CONSTRAINT fk_authorities_users FOREIGN KEY(username) REFERENCES users(username)
);

CREATE UNIQUE INDEX ix_auth_username
  ON authorities(username,authority);

其中,users表用于存储用户名、密码、是否激活等信息,authorities表用于存储用户名和角色信息。

可以根据实际需求修改表结构。

3. 编写数据访问层代码

在Spring Security中,需要实现UserDetailsService接口来获取用户信息。可以通过JDBC、MyBatis、Hibernate等方式访问数据库,并实现UserDetailsService接口。

下面是通过JDBC访问数据库的示例:

import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JdbcUserDetailsService implements UserDetailsService {

    private final DataSource dataSource;

    public JdbcUserDetailsService(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        String sql = "SELECT username,password,enabled FROM users WHERE username=?";
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, username);
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                String password = rs.getString("password");
                boolean enabled = rs.getBoolean("enabled");
                String roleSql = "SELECT authority FROM authorities WHERE username=?";
                PreparedStatement rolePs = conn.prepareStatement(roleSql);
                rolePs.setString(1, username);
                ResultSet roleRs = rolePs.executeQuery();
                List<SimpleGrantedAuthority> authorities = new ArrayList<>();
                while (roleRs.next()) {
                    String authority = roleRs.getString("authority");
                    SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(authority);
                    authorities.add(simpleGrantedAuthority);
                }
                return new User(username, password, enabled, true, true, true, authorities);
            } else {
                throw new UsernameNotFoundException("User not found with username: " + username);
            }
        } catch (SQLException e) {
            throw new UsernameNotFoundException("Error reading user data", e);
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

在这个示例中,我们通过DataSource获取Connection对象,然后执行查询SQL语句获取用户信息和角色信息。最后返回一个UserDetails对象,表示当前用户的详细信息。

4. 配置Spring Security

在Spring Security中配置UserDetailsService的实现类,并指定加密算法:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        JdbcUserDetailsService userDetailsService = new JdbcUserDetailsService(dataSource);
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasRole("USER")
                .anyRequest().permitAll()
                .and()
                .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/index")
                .permitAll()
                .and()
                .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login")
                .permitAll()
                .and()
                .csrf()
                .disable();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}

在这个示例中,我们配置了两个权限:ADMIN和USER,分别对应不同的URL模式。在configure方法中,我们配置了登录页、登出URL、成功跳转页面等相关信息。

小结

通过以上步骤,我们可以将Spring Security的用户数据存储到数据库中。只需要实现UserDetailsService接口,读取数据库中的数据即可。

示例代码可以参考Spring官方文档的示例代码:jbc-authenticationjpa-authentication。这两个示例分别演示了通过JDBC和JPA方式读取数据库中用户数据的方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Security将用户数据存储到数据库的方法 - Python技术站

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

相关文章

  • SpringSecurity学习之自定义过滤器的实现代码

    我会尽力详细讲解。 首先介绍一下Spring Security,它是一个开源框架,用于为基于Spring的应用程序提供身份验证和授权管理功能。Spring Security是一个功能强大,使用广泛的安全框架,已经成为企业级应用领域的标准选择之一。本文将通过实战示例,详细讲解如何在Spring Security中自定义过滤器。 1. 自定义过滤器的概念 在Sp…

    Java 2023年5月20日
    00
  • AngularJS ng-blur 指令详解及简单实例

    AngularJS ng-blur 指令详解及简单实例 什么是ng-blur指令? ng-blur是AngularJS中的一个指令,它用于在指定元素失去焦点时执行一个表达式或函数。具体来说,当元素上绑定了ng-blur指令时,当该元素失去焦点时,会自动执行与该指令绑定的表达式或函数。 ng-blur指令的使用方法 我们可以将ng-blur指令添加到任何HTM…

    Java 2023年6月15日
    00
  • SpringBoot JWT实现token登录刷新功能

    下面就为你详细讲解“SpringBoot JWT实现token登录刷新功能”的完整攻略。 什么是JWT JWT即Json Web Token,是基于JSON格式的令牌,包含有用户的一些身份信息和一些验证信息。在用户登录后,服务器会生成一个JWT给前端返回,在之后的请求中,前端只需在HTTP头中携带该令牌即可实现状态保持。 实现流程 首先,我们需要在项目中引入…

    Java 2023年5月20日
    00
  • SpringBoot整合ip2region实现使用ip监控用户访问城市的详细过程

    下面是整合ip2region实现使用ip监控用户访问城市的详细过程: 步骤一:创建SpringBoot项目 首先,我们需要创建一个SpringBoot项目,可以使用Spring Initializr(https://start.spring.io/)来创建项目。 步骤二:添加依赖 在创建完成后,在pom.xml文件中添加ip2region的Maven依赖: …

    Java 2023年5月19日
    00
  • springboot-jpa的实现操作

    下面是对“springboot-jpa的实现操作”的完整攻略。 一、概述 Spring Boot是一个快速开发框架,提供了很多快捷而且方便的配置方式,其中对JPA的支持也是非常好的。本攻略将介绍如何使用Spring Boot进行JPA的实现操作。 二、前提条件 在继续之前,你需要确保以下条件已满足: 你已经掌握了基本的Spring Boot使用; 你已经安装…

    Java 2023年5月20日
    00
  • 关于spring boot使用 jdbc+mysql 连接的问题

    请看下面的攻略: 1.引入相关依赖 在pom.xml文件中加入以下依赖: <dependencies> <!– Spring Boot JDBC 依赖 –> <dependency> <groupId>org.springframework.boot</groupId> <artifact…

    Java 2023年5月20日
    00
  • 一篇文章带你入门Java运算符

    一篇文章带你入门Java运算符 运算符是编程语言中非常重要的基础知识之一,Java作为一门主流的编程语言也是如此。在这篇文章中,我们将详细讲解Java中的各种运算符,带你入门Java运算符。本文主要内容如下: 基础概念介绍 算术运算符 赋值运算符 比较运算符 逻辑运算符 位运算符 基础概念介绍 在学习Java运算符之前,我们需要先了解一些基础概念。Java中…

    Java 2023年5月23日
    00
  • 防止未登录用户操作—基于struts2拦截器的简单实现

    防止未登录用户操作是常见的Web应用程序的安全性需求之一。基于struts2拦截器可以方便地实现这一功能。接下来,我将详细讲解如何基于struts2拦截器实现防止未登录用户操作的功能。 步骤一:创建Session监听器 在Java Web应用程序中,每个会话都关联一个HTTP会话(Session)。Session监听器可以在会话开始和结束时执行操作,我们可以…

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