java InMemoryUserDetailsManager将用户名和密码存储在何处,以及如何直接访问它(无需通过代码调用)[已关闭]

jjhzyzn0  于 2023-02-28  发布在  Java
关注(0)|答案(1)|浏览(443)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

2天前关闭。
Improve this question
我想知道UserDetailsService下的InMemoryUserDetailsManager在Spring Security中存储数据的位置。我想知道像数据库一样它在哪里。

public UserDetailsService users() {
        UserDetails user = User.builder()
            .username(securityUser)
            .password(passwordEncoder().encode(securityPassword))
            .roles("USER")
            .build();
        UserDetails admin = User.builder()
            .username(securityAdminUser)
            .password(passwordEncoder().encode(securityAdminPassword))
            .roles("USER", "ADMIN")
            .build();
        return new InMemoryUserDetailsManager(user, admin);
    }
h79rfbju

h79rfbju1#

正如在评论中提到的,用户信息存储在Map的内存中,通过几种方法可以很容易地获得所需的信息。
如果您希望打印正在设置的密码的编码(散列)版本,请尝试在启动时打印出来,如下所示:

@Bean
    public UserDetailsService userDetailsService() {
        String pw = passwordEncoder().encode(securityPassword);
        System.out.println(pw);
        
        UserDetails user = User.builder()
            .username(securityUser)
            .password(pw)
            .roles("USER")
            .build();

        pw = passwordEncoder().encode(securityAdminPassword);
        System.out.println(pw);

        UserDetails admin = User.builder()
            .username(securityAdminUser)
            .password(pw)
            .roles("USER", "ADMIN")
            .build();
        return new InMemoryUserDetailsManager(user, admin);
    }

确保UserDetailsService是一个@Bean,并且您还可以将其注入到任何组件中,并查找用户以打印出散列密码用于测试。

// in some @Service
@Autowired
private UserDetailsService userDetailsService;
// ...

// in some method
UserDetails user = this.userDetailsService.loadUserByUsername(securityUser);
System.out.println(user.getPassword());

你可能最终想知道的是如何对密码进行编码并将其存储在数据库中,这可能是你自己建立的东西。
要在保存用户之前对密码进行编码,可以将PasswordEncoder公开为bean(将@Bean添加到passwordEncoder()方法中),并将其注入到用于创建用户的组件中,例如@PostMapping("/register")这样的自定义@RestController端点。
最后,Spring Boot CLI有一个encodepassword命令。

spring encodepassword password

产出

{bcrypt}$2a$10$GI3k27oFcngP5gzTWJPpQ.Ghbnw2zkpOkdbT68x8fpQgqBuv8eBj.

通过这种方式,您实际上可以将密码存储在内存中(通常仅用于测试),但它们会像在数据库中一样进行哈希处理。

@Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.builder()
            .username(securityUser)
            .password("{bcrypt}$2a$10$GI3k27oFcngP5gzTWJPpQ.Ghbnw2zkpOkdbT68x8fpQgqBuv8eBj.")
            .roles("USER")
            .build();
        UserDetails admin = User.builder()
            .username(securityAdminUser)
            .password("...")
            .roles("USER", "ADMIN")
            .build();
        return new InMemoryUserDetailsManager(user, admin);
    }

相关问题