成功登录后如何修改spring SecurityContextHolder.getContext()。getAuthentication()对象?

时间:2019-07-02 09:16:30

标签: spring spring-boot spring-mvc spring-security

我正在使用Spring Boot应用程序,在该应用程序中,我通过如下扩展UserDetails创建了CustomUserDetails类。

    QProcess p;
    QStringList params;

    params << "createJSON.py";
    p.start("python.exe", params);
    p.waitForFinished(-1);
    QString p_stdout = p.readAll();

我需要在UserDetails对象中修改租户详细信息。为此,我已经检查了

How to update Spring Security UserDetails impls after successful login?

https://stackanswers.net/questions/how-to-immediately-enable-the-authority-after-update-user-authority-in-spring-security

https://dev.to/onlineinterview/user-account-loginregistration-feature-with-spring-boot--3fc3

控制器在这里,我正在更新身份验证对象:

public class CustomUserDetails
    extends org.springframework.security.core.userdetails.User {

private static final long serialVersionUID = 1L;

/**
 * The extra field in the login form is for the tenant name
 */
private String tenant;
private Long userId;
private String firstName;
private String middleName;
private String lastName;
private String email;
private String role;

我的问题是,当我遇到另一个执行特定操作的请求时,我没有在从

获取的CustomUserDetails对象中找到租户详细信息。
  

SecurityContextHolder.getContext()。getAuthentication()

请让我知道如何更新或修改Authentication的UserDetails对象并保存回去,以便另一个请求获得更新的CustomUserDetails。

1 个答案:

答案 0 :(得分:1)

UserDetails应该设置为Principal的{​​{1}},而不是java docs建议的UsernamePasswordAuthenticationToken

  

AuthenticationManager实现通常会返回一个   包含更丰富的信息作为使用主体的身份验证   通过应用程序。许多身份验证提供程序将创建一个   UserDetails对象作为主体。

Details中的

Details通常是存储用户的IP地址或证书序列号等。

因此将其更改为:

UsernamePasswordAuthenticationToken