spring security中如何通过用户id查询用户?

Posted

技术标签:

【中文标题】spring security中如何通过用户id查询用户?【英文标题】:How to query users by user id in spring security? 【发布时间】:2020-12-09 02:31:45 【问题描述】:

我有一个带有 Spring Security 的 Spring Boot 应用程序,我在其中扩展了 org.springframework.security.core.userdetails.User 类以创建自定义用户对象。我是硬编码用户,因为我只需要一些来测试一些功能。我该如何查询并根据其用户 ID 或电子邮件 ID 获取某个用户,这是我添加的自定义变量?有没有办法在不转向 jdbc 身份验证等的情况下做到这一点,因为我觉得它可能会过于复杂?

我的自定义用户类:

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.User;
import java.util.Collection;
import java.util.List;

public class Guest extends User 
    public Guest(String username, String password, boolean enabled, boolean accountNonExpired,
                       boolean credentialsNonExpired, boolean accountNonLocked,
                       Collection<? extends GrantedAuthority> authorities) 
        super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
    
    private long id;
    private String firstName;
    private String lastName;
    private String emailAddress;
    private String phoneNumber;
    
    //some getters and setters

    public Guest(long id, String firstName, String lastName, String emailAddress, String phoneNumber, String username, String password, List<GrantedAuthority> authorities,
                 boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked) 


        super(username, password, enabled, accountNonExpired, credentialsNonExpired,
                accountNonLocked, authorities) ;
        this.id=id;
        this.firstName=firstName;
        this.lastName=lastName;
        this.emailAddress=emailAddress;
        this.phoneNumber=phoneNumber;
    

我的新 userdetailsS​​ervice 类:

@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService 
    private static List<Guest> users = new ArrayList();

    public MyUserDetailsService()  
    //hard-coding users

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException 
    //building user here

SecurityConfig.java

@Configuration
@EnableWebSecurity
public class ApplicationSecurityConfiguration extends WebSecurityConfigurerAdapter
    
    @Autowired
    @Qualifier("userDetailsService")
    private UserDetailsService userDetailsService;

    @Bean
    public BCryptPasswordEncoder passwordEncoder() 
        return new BCryptPasswordEncoder();
    ;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
       //authorization logic here        
    


【问题讨论】:

系统常量变量中的硬编码方式? 是的,我通过调用带有一些值的构造函数创建了一些虚拟用户。我的项目中没有外部数据源。 【参考方案1】:

如果你需要它来模拟实现,你可以像下面的示例一样使用硬编码值。

public UserDetails loadUserByUsername(String userName)
        
//use your custom 'List<Guest> users' hardcoded values to create User object

User user = new User(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked,
                authorities);
return user;

注意:- loadUserByUsername(String username).. 这里 userName 可以是 userToken ,其中包含您想要作为参考的任何信息。 (通常你用来查询 db 以获取 usrname 和 pass).. 在这种情况下,让我们说 Id.. 一旦你得到上面的 id(作为 userToken/userName),你可以与你的客人列表进行比较以加载用户对象

【讨论】:

以上是关于spring security中如何通过用户id查询用户?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Security 和 Thymeleaf 获取当前登录用户的 ID

如何在表 Spring + Hibernate + Spring Security 中填充外键

我应该在 web 应用程序的 spring/spring-security 中将用户 ID 密钥存储在哪里?

如何允许用户在 Spring Boot / Spring Security 中仅访问自己的数据?

Spring Security:如何在公共页面中识别用户已通过身份验证

如何在 Spring Security 中指定 Open ID Realm?