当前位置:首页 > 技术 > 正文内容

Spring Security 基于内存的身份验证配置实践

访客 技术 2026年6月25日 1

在 Spring Security 架构中,用户凭证的来源具有高度灵活性,既可以是外部持久化存储如数据库、LDAP,也可以是临时的内存数据。无论底层实现如何,最终都会被抽象为 UserDetailsService 接口的具体实例,以此统一处理认证请求。

针对开发测试场景,以下详细说明三种构建内存用户数据源的实现路径:

一、框架自动生成的临时凭证

在未显式定义安全配置且启用 Spring Security 的情况下,框架会处于一种保护模式。每次应用启动时,控制台将打印一组随机的访问令牌。通常用户名固定为 user,而密码则为系统随机生成的 UUID 格式字符串,需手动复制以完成登录。

二、通过配置文件指定凭据

为了便于调试,开发者可以通过外部化配置文件直接固化账号密码,避免每次重启都依赖随机码。在 application.properties 或 YAML 文件中添加相应键值对即可生效。

# 自定义内存用户标识
security.user.name=developer
security.user.password=test@2024

上述配置生效后,控制台将不再输出随机密码,系统默认接受指定的账号组合进行登录。

三、Java 代码动态配置(两种模式)

对于需要精细控制用户角色和权限的场景,推荐直接使用 Java 注解进行配置。以下是两种常用的编程式实现方案。

3.1 使用 UserDetailsManager 构建服务

此方式通过创建一个 InMemoryUserDetailsManager 的 Bean 来接管用户管理。我们可以通过构造函数一次性注入所有用户信息,这种方式相比逐个创建更为简洁。

package com.example.auth.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@Configuration
public class AuthDataConfig {

    @Bean
    public UserDetailsService loadMemoryUsers() {
        // 构建用户列表并传递给构造函数
        return new InMemoryUserDetailsManager(
            User.builder()
                .username("sysAdmin")
                .password("{noop}888888") // 使用简单标记,实际生产建议加密
                .roles("ADMIN", "MANAGER")
                .build(),
            User.builder()
                .username("visitor")
                .password("{noop}guest_pass")
                .roles("GUEST")
                .build()
        );
    }
}

3.2 基于 AuthenticationManagerBuilder 配置

另一种方式是继承标准的安全配置适配器,利用 AuthenticationManagerBuilder 链式调用方法定义内存用户。这种方式更适合与过滤链配置结合。

package com.example.web.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@Configuration
@EnableWebSecurity
public class WebAuthInitializer {

    @Bean
    public PasswordEncoder encoder() {
        // 此处示例使用无加密模式以便演示,实际应使用 BCrypt
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
            .formLogin(Customizers.withDefaults());
        
        // 显式声明 AuthenticationManager
        http.authenticationProvider(getAuthProvider(encoder()));
        
        return http.build();
    }
    
    private InMemoryUserDetailsManager getAuthProvider(PasswordEncoder enc) {
        InMemoryUserDetailsManager detailsMgr = new InMemoryUserDetailsManager();
        detailsMgr.createUser(org.springframework.security.core.userdetails.User
            .withUsername("editor")
            .password(enc.encode("securePwd"))
            .roles("EDITOR")
            .build());
        return detailsMgr;
    }
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。