spring-security 如何从UserDetailsService获取HttpServletRequest信息

zzwlnbp8  于 2022-11-11  发布在  Spring
关注(0)|答案(3)|浏览(229)

我正在使用spring security,我已经实现了我的服装UserDetailsService.loadUserByUsername,它返回一个服装UserDetails。我的问题是,我希望在我的UserDetailsService实现中从HttpServletRequest中获取信息,更具体地说,我希望获得request.getLocale();。我该怎么做呢?

vuv7lop3

vuv7lop31#

您应该能够(取决于您的配置)使用

LocaleContextHolder.getLocaleContext().getLocale();

LocaleContextHolder存储一个staticThreadLocal对象,该对象存储您请求的Locale
您可能必须向Servlet容器注册RequestContextListener

yvt65v4c

yvt65v4c2#

您可以将其从控制器传递到服务,从而向服务添加新参数

xmq68pz9

xmq68pz93#

我把这个留给其他人,因为我在其他地方找不到答案。经过一些修改后,我发现您可以将请求添加到bean中,如下所示:

@Configuration
public class SecurityConfig {
    @Bean
    public UserDetailsService userDetailsService(MyRepository repository, HttpServletRequest request) {
        return username -> {
            UserDetails userDetails = repository.findByEmail(username);
            if (userDetails != null) {
                log.info("login." + userDetails);
                return userDetails;
            }
            String locale = request.getLocale().getDisplayName();
            String message = "not.found[" + username + "].locale[" + locale + "]";
            log.error(message);
            throw new UsernameNotFoundException(message);
        };
    }
}

相关问题