1

我正在使用 Spring Boot 创建一个程序,我想显示所有用户信息(我添加了名字、姓氏、城市等)我可以通过以下方式显示用户名:

<span sec:authentication="principal.username">

现在我想像这样显示名字:

<span sec:authentication="principal.FirstName">

这是代码片段:

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        
    User user = userRepository.findByEmail(username);
        
    if (user == null) {
        throw new UsernameNotFoundException("invalid username or password.");
    }
        
    return new org.springframework.security.core.userdetails.User(user.getEmail(), user.getPassword(), mapRolesToAuthorities(user.getRoles()));
}

问题是我想添加什么才能显示所有信息?

4

1 回答 1

0

如果您想/需要使用-authentication-tag

此标记允许访问存储在安全上下文中的当前身份验证对象。它直接在 JSP 中呈现对象的属性。因此,例如,如果Authentication 的 principal 属性是 Spring Security 的 UserDetails 对象的一个​​实例,那么使用 <sec:authentication property="principal.username" /> 将呈现当前用户的名称。

那么你应该:

  1. 子类org.springframework.security.core.userdetails.User/实现UserDetails。( MyUserDetails)。
  2. 丰富MyUserDetails(用firstName,lastName等)
  3. 并返回MyUserDetails而不是new org.springframework.security.core.userdetails.User(...)
  4. 然后您可以访问任何(自定义)属性,例如<span sec:authentication="principal.firstName">( principal.foo, principal.bar)

如果适用,甚至更棘手,更贪婪/高效:

备用MyUserDetails零件并让您的 (persistent, com.my.company...)User 扩展 org.springframework.security.core.userdetails.User... 以直接返回它(从 db)。

但正如文档还指出/人们更喜欢的那样:

当然,这种事情没有必要使用 JSP 标签,有些人更喜欢在视图中保留尽可能少的逻辑。您可以访问 MVC 控制器中的 Authentication 对象(通过调用 SecurityContextHolder.getContext().getAuthentication())并将数据直接添加到模型以供视图呈现。

(以任何可以想象的方式)

于 2021-02-02T23:44:23.257 回答