gpt4 book ai didi

java - spring security 从数据库中获取用户 ID

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:44:47 26 4
gpt4 key购买 nike

我正在使用 spring security 进行身份验证并成功获得 User在我需要的任何地方对象 ( org.springframework.security.core.userdetails.User)。

但我想要UserId另外, Spring 的 User 中没有目的。所以我创建了自己的对象(com.app.site.pojo.User)。它有一些额外的变量,例如 userIduser date of birth 等。现在我希望 spring security 使用我的 user对象而不是 Spring User目的。它应该包含有关该用户的所有详细信息。

我试图将用户对象类型转换为我的对象,它抛出异常(很明显)。

我不想再次进行数据库调用以再次从数据库中获取用户 ID。

我怎样才能实现它?

最佳答案

执行此操作的更好方法是创建一个 UserDetaisService,它返回一个扩展您的对象类型并实现 UserDetails 的对象。这意味着您只需执行一次数据库查找。

通过让 loadUserByUsername 的结果实现 UserDetails 并扩展您的 User 对象,您可以将其称为自定义用户对象,而 Spring Security 可以将其称为 UserDetails。

例如:

@Service
public class UserRepositoryUserDetailsService implements UserDetailsService {
private final UserRepository userRepository;

@Autowired
public UserRepositoryUserDetailsService(UserRepository userRepository) {
this.userRepository = userRepository;
}

public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
User user = userRepository.findByEmail(username);
if(user == null) {
throw new UsernameNotFoundException("Could not find user " + username);
}
return new UserRepositoryUserDetails(user);
}

private final static class UserRepositoryUserDetails extends User implements UserDetails {

private UserRepositoryUserDetails(User user) {
super(user);
}

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return AuthorityUtils.createAuthorityList("ROLE_USER");
}

@Override
public String getUsername() {
return getEmail();
}

@Override
public boolean isAccountNonExpired() {
return true;
}

@Override
public boolean isAccountNonLocked() {
return true;
}

@Override
public boolean isCredentialsNonExpired() {
return true;
}

@Override
public boolean isEnabled() {
return true;
}

private static final long serialVersionUID = 5639683223516504866L;
}
}

然后您可以在您的配置中引用自定义的 UserDetailsS​​ervice。例如:

<security:authentication-manager>
<security:authentication-provider user-service-ref="customUserDetails" />
</security:authentication-manager>
<bean id="customUserDetails" class="sample.UserRepositoryUserDetailsService"/>

如果您使用的是 Spring Security 3.2.x+,则可以使用 Spring Security 的 @AuthenticationPrincipal解析自定义用户对象。例如:

@RequestMapping("/messages/inbox")
public ModelAndView findMessagesForUser(@AuthenticationPrincipal CustomUser customUser) {

// .. find messags for this user and return them ...
}

否则您可以使用以下内容:

@RequestMapping("/messages/inbox")
public ModelAndView findMessagesForUser(Authentication auth) {
User customUser = (User) auth.getPrincipal();
...
}

如果使用 XML 配置,则需要向 Spring MVC 注册 AuthenticationPrincipalArgumentResolver。

<mvc:annotation-driven>
<mvc:argument-resolvers>
<beans:bean class="org.springframework.security.web.bind.support.AuthenticationPrincipalArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>

您可以在我的 github sample project 中找到有关此的详细信息.自述文件还引用了 the recorded webinar .

关于java - spring security 从数据库中获取用户 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29327159/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com