Spring Security的持久化用户和授权实现方式

 更新时间:2025年02月18日 11:04:58   作者:Exill  
文章介绍了如何使用JdbcUserDetailsManager实现数据库读取用户,并展示了如何配置SpringSecurity进行授权管理,通过创建数据库表、配置数据库连接和修改SecurityConfig,实现了用户权限的控制

使用JdbcUserDetailsManager(UserDetailsService另一种实现)实现数据库读取用户

1.引入jdbc和相关数据库驱动

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>

2.创建数据库表

--用户表
CREATE TABLE users( 
    username VARCHAR(50)  NOT NULL PRIMARY KEY --用户名, 
    password VARCHAR(500) NOT NULL             --密码, 
    enabled  BOOLEAN      NOT NULL             --有效性
);
--权限表
CREATE TABLE authorities( 
    username  VARCHAR(50) NOT NULL  --用户名, 
    authority VARCHAR(50) NOT NULL  --权限, 
    constraint fk FOREIGN KEY(username) REFERENCES users(username)
);
CREATE unique index ix_auth_username ON authorities (username, authority);

3.配置数据库连接(application.yml)

spring:
    datasource:
        driver-class-name: org.postgresql.Driver
        url: jdbc:postgresql://localhost:5432/security
        username:postgres
        password: postgres

4.修改SecurityConfig配置

@Configuration
public class SecurityConfig {
    //配置Security过滤链
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        //配置哪些接口需要认证(.anyRequest().authenticated()代表任何请求都需认证)
        http.authorizeHttpRequests(authorize -> {
            authorize.anyRequest().authenticated();
        });
        //配置post表单请求/login接口
        http.formLogin(Customizer.withDefaults());
        //csrf攻击:开发环境可不配方便调试,上线环境需配置,否则会遭csrf攻击
        http.csrf(AbstractHttpConfigurer::disable);
        //返回Security过滤链对象
        return http.build();
    }

    @Bean //配置JdbcUserDetailsManager实现数据库存储用户
    public UserDetailsService userDetailsService(DataSource dataSource) {
        return new JdbcUserDetailsManager(dataSource);
    }
}

实现Spring Security授权功能

1.创建接口

@RestController
public class HelloController{

    @RequestMapping("/hello")
    public String hello() { 
        return "Hello Security"; 
    }

    @RequestMapping("/hello1")
    public String hello1() { 
        return "Hello Security1"; 
    }

}

2.配置数据库账号和权限(DbUser用户拥有hello和hello1权限、DbUser1只拥有hello1权限)

3.修改SecurityConfig配置

@Configuration
public class SecurityConfig {
    //配置Security过滤链
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        //配置哪些接口需要认证(.anyRequest().authenticated()代表任何请求都需认证)
        http.authorizeHttpRequests(authorize -> {
            authorize.requestMatchers("/hello").hasAuthority("hello");
            authorize.requestMatchers("/hello1").hasAuthority("hello1");
            authorize.anyRequest().authenticated();
        });
        //配置post表单请求/login接口
        http.formLogin(Customizer.withDefaults());
        //csrf攻击:开发环境可不配方便调试,上线环境需配置,否则会遭csrf攻击
        http.csrf(AbstractHttpConfigurer::disable);
        //返回Security过滤链对象
        return http.build();
    }

    @Bean //配置JdbcUserDetailsManager实现数据库存储用户
    public UserDetailsService userDetailsService(DataSource dataSource) {
        return new JdbcUserDetailsManager(dataSource);
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java IO学习之缓冲输入流(BufferedInputStream)

    Java IO学习之缓冲输入流(BufferedInputStream)

    这篇文章主要介绍了Java IO学习之缓冲输入流(BufferedInputStream)的相关资料,需要的朋友可以参考下
    2017-02-02
  • java 多线程与并发之volatile详解分析

    java 多线程与并发之volatile详解分析

    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机
    2021-11-11
  • Spring数据库连接池url参数踩坑及解决

    Spring数据库连接池url参数踩坑及解决

    这篇文章主要介绍了Spring数据库连接池url参数踩坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 解决springboot利用ConfigurationProperties注解配置数据源无法读取配置信息问题

    解决springboot利用ConfigurationProperties注解配置数据源无法读取配置信息问题

    今天在学习springboot利用ConfigurationProperties注解配置数据源的使用遇到一个问题无法读取配置信息,发现全部为null,纠结是哪里出了问题呢,今天一番思考,问题根源找到,下面把我的解决方案分享到脚本之家平台,感兴趣的朋友一起看看吧
    2021-05-05
  • Spring IoC容器常见获取Bean的方式汇总示例解析

    Spring IoC容器常见获取Bean的方式汇总示例解析

    这篇文章主要为大家介绍了Spring IoC容器常见获取Bean的方式汇总示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 如何调试报表插件

    如何调试报表插件

    在项目开发过程中插件调试非常的麻烦,需要修改里面的代码,编译出class,需要重新打包插件。然后把之前的删除,重新安装最新的。调试过程比较繁琐,而且不能调试,十分的不方便,这篇文章主要介绍的是调试报表插件的方法,需要的朋友可以参考下
    2015-07-07
  • Java实现小型图书馆管理系统

    Java实现小型图书馆管理系统

    这篇文章主要为大家详细介绍了Java实现小型图书馆管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 详解Java的位操作符

    详解Java的位操作符

    位操作就是对这些数据进行基本的操作。如果基本类型是char、byte或者short类型的数值进行移位处理,那么会转化成int类型,再进行移位的处理
    2017-09-09
  • java字符串求并集的方法

    java字符串求并集的方法

    这篇文章主要介绍了java字符串求并集的方法,涉及Java字符串操作中union方法的使用,是Java字符串操作中非常实用的基本技巧,需要的朋友可以参考下
    2014-11-11
  • Java变量命名规则详解及常见命名错误(建议收藏)

    Java变量命名规则详解及常见命名错误(建议收藏)

    这篇文章主要介绍了Java中变量命名的规则及最佳实践,包括有效字符、大小写敏感性、不能使用保留字、驼峰命名法、描述性命名、特定类型的命名习惯、避免潜在问题、常见命名错误及如何避免等内容,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-02-02

最新评论