【问题标题】:Spring Security User InformationSpring Security 用户信息
【发布时间】:2014-10-27 10:18:41
【问题描述】:

我有一个关于 Spring Security 和获取当前登录 User 的更多信息(实例变量)的快速问题。默认情况下,无需编写自己的UserDetailsService 有没有办法获得在我的User bean 中定义的任何其他实例变量?您可能已经知道,通过将以下代码放在我的一个控制器中,我可以访问以下字段,例如:用户名、密码、启用、权限等。

UserDetails userDetails = 
               (UserDetails) ((Authentication)principal).getPrincipal();

我想获取其他信息,例如我在我的用户对象(ID、NAME、EMAIL、ETC)中定义的以下实例变量:

 // Instance Variables
 private int id;
 private String name;
 private String email;
 private String username; // I can already obtain this
 private String password; // I can already obtain this

您能否提供一些进一步的帮助,以便我可以获取更多信息?

【问题讨论】:

    标签: java spring spring-mvc spring-security


    【解决方案1】:

    如您所知,您可以使用以下代码获取 UserDetails 对象。

    UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    

    使用 UserDetails 对象,您可以获得用户名、密码和权限。现在您需要该用户的 ID 和电子邮件。在这种情况下,一旦您的用户通过身份验证,您就可以进行数据库查询,该查询将通过用户名返回您的用户对象。

    【讨论】:

      【解决方案2】:

      您的用户对象必须实现 UserDetails 接口。当您获得对它的引用时,将其正确转换,以便您可以访问 getter 方法。

      假设你的用户对象是这样的

      public class MyUser implements UserDetails{
           private int id;
           private String name;
           private String email;
           private String username;
      
      }
      

      成功登录后,您会将 MyUser 的实例存储为主体。

      然后

           MyUser userDetails = 
                 (MyUser) ((Authentication)principal).getPrincipal();
           String name = userDetails.getName();
      

      【讨论】:

      • 谢谢。您能否提供一个示例来说明“当您获得对它的引用时正确转换它”的含义。这将不胜感激。
      猜你喜欢
      • 2012-02-28
      • 2018-10-20
      • 2012-05-23
      • 2013-09-14
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 2021-11-10
      • 2017-12-22
      相关资源
      最近更新 更多