【问题标题】:Spring SecurityContextHolder getPrincipal model.User vs. userDetails.UserSpring SecurityContextHolder getPrincipal model.User vs. userDetails.User
【发布时间】:2020-05-15 13:05:18
【问题描述】:

在运行时,当我像这样检索经过身份验证的用户时:

SecurityContextHolder.getContext().getAuthentication().getPrincipal()

我从我的应用程序模型中得到User

test.package.model.User

当我在测试期间检索用户时,我从 UserDetails 获取用户:

org.springframework.security.core.userdetails.User

我正在使用 MockMvc 作为经过身份验证的用户测试我的 bean。 在测试期间,我正在使用 InMemoryUserDetailsManager:

    @SuppressWarnings("unchecked")
    private Collection<UserDetails> users = Collections.emptyList();

    @Bean
    @Primary
    public UserDetailsService userDetailsService() {

        /** User from application model, not userDetails.User type */
        User user = new User("bob")
        users = Arrays.asList(user);
        InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager(users);
        return inMemoryUserDetailsManager;
    }

    public Collection<UserDetails> getUsers() {
        return users;
    }

我在测试过程中的请求是这样的:

@WithUserDetails("bob") 
public void showUser() throws Exception {
    this.mockMvc.perform(get("/user"))
                .andDo(print());
}

我想在运行时和测试时保持一致。 我应该使用哪种用户类型?为什么?

【问题讨论】:

    标签: spring testing spring-security runtime


    【解决方案1】:

    如果不向您的应用程序发送请求,您将拥有默认上下文

    所以在这个上下文中存储的用户是

    的一个实例
    org.springframework.security.core.userdetails.User
    

    但是当你向你的应用程序发送请求时,上下文会改变。

    【讨论】:

      猜你喜欢
      • 2020-02-18
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 2017-03-07
      • 2011-03-28
      • 2014-01-12
      相关资源
      最近更新 更多