首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有没有办法在存储库中从Spring Security获取最新的userId?

在存储库中从Spring Security获取最新的userId的方法是通过使用Spring Security提供的SecurityContextHolder类来获取当前用户的身份信息。SecurityContextHolder是一个用于存储当前用户身份信息的上下文对象。

要获取最新的userId,可以按照以下步骤进行操作:

  1. 导入所需的依赖:
代码语言:txt
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  1. 创建一个自定义的UserDetails实现类,该类用于存储用户的身份信息,包括userId等相关信息。
  2. 创建一个自定义的UserDetailsService实现类,该类用于从存储库中获取用户信息,并将其封装到UserDetails对象中。
  3. 在Spring Security的配置类中,通过重写configure方法来配置认证和授权规则,并将自定义的UserDetailsService实现类注入到AuthenticationManagerBuilder中。
  4. 在需要获取最新userId的地方,可以通过SecurityContextHolder获取当前用户的身份信息,然后从中提取出userId。

以下是一个示例代码:

代码语言:txt
复制
// 自定义UserDetails实现类
public class CustomUserDetails implements UserDetails {
    private Long userId;
    // 其他属性和方法省略
}

// 自定义UserDetailsService实现类
@Service
public class CustomUserDetailsService implements UserDetailsService {
    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found");
        }
        return new CustomUserDetails(user.getId(), user.getUsername(), user.getPassword());
    }
}

// Spring Security配置类
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private CustomUserDetailsService userDetailsService;

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

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 配置认证和授权规则
        http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
            .and()
            .formLogin()
            .and()
            .logout().logoutSuccessUrl("/login");
    }
}

// 获取最新userId的方法
public Long getCurrentUserId() {
    CustomUserDetails userDetails = (CustomUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    return userDetails.getUserId();
}

在上述示例中,我们通过自定义UserDetails和UserDetailsService实现类来获取用户信息,并在SecurityConfig中配置了认证和授权规则。在需要获取最新userId的地方,我们可以通过SecurityContextHolder获取当前用户的身份信息,并从中提取出userId。

请注意,上述示例中的代码仅为演示目的,实际应用中可能需要根据具体情况进行适当的修改和调整。

推荐的腾讯云相关产品:腾讯云云服务器(ECS)、腾讯云对象存储(COS)、腾讯云数据库(TencentDB)等。你可以通过访问腾讯云官方网站获取更详细的产品介绍和文档:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring Security 实战干货:SecurityContext相关的知识

欢迎阅读 Spring Security 实战干货[1] 系列文章 。在前两篇我们讲解了 基于配置[2] 和 基于注解[3] 来配置访问控制。今天我们来讲一下如何在接口访问中检索当前认证用户信息。我们先讲一下具体的场景。通常我们在认证后访问需要认证的资源时需要获取当前认证用户的信息。比如 “查询我的个人信息”。如果你直接在接口访问时显式的传入你的 UserID 肯定是不合适的。因为你认证通过后访问资源,系统是知道你是谁的。而且显式的暴露用户的检索接口也不安全。所以我们需要一个业务中可以检索当前认证用户的工具。接下来我们来看看 Spring Security 是如何解决这个痛点的。文末现金抽奖福利!

03

认证鉴权与API权限控制在微服务架构中的设计与实现(一)

引言: 本文系《认证鉴权与API权限控制在微服务架构中的设计与实现》系列的第一篇,本系列预计四篇文章讲解微服务下的认证鉴权与API权限控制的实现。 1. 背景 最近在做权限相关服务的开发,在系统微服务化后,原有的单体应用是基于session的安全权限方式,不能满足现有的微服务架构的认证与鉴权需求。微服务架构下,一个应用会被拆分成若干个微应用,每个微应用都需要对访问进行鉴权,每个微应用都需要明确当前访问用户以及其权限。尤其当访问来源不只是浏览器,还包括其他服务的调用时,单体应用架构下的鉴权方式就不是特别合适了

06
领券