【问题标题】:Update User's first name and last name in principal在主体中更新用户的名字和姓氏
【发布时间】:2018-05-31 09:34:59
【问题描述】:

我正在更新用户的信息,例如 名字姓氏,并且我会在所有页面中获取名字和姓氏以获取 欢迎信息.

我有两个控制器,一个用于 ajax 请求映射,另一个用于 普通 请求映射。

普通请求映射控制器有这个方法。在这个控制器中,所有页面导航都存在,并且一些不是 ajax 调用的请求映射

private String getPrincipalDisplay() {
    GreenBusUser user = null;
            String userName = "";
            Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

            if (principal instanceof UserDetails) {
                user = (GreenBusUser) principal;
                userName = user.getFirstName() + " " + user.getLastName();
            } else {
                userName = "";
            }
            return userName;
}

这就是我如何通过此函数的返回字符串在每个页面上获取 用户名,我将其添加到 ModelMap 对象中。

当我更新用户信息时,我正在做 ajax 请求映射。

@RequestMapping(value = "/restify/updateUserData",  method = RequestMethod.PUT, headers = "Accept=application/json")
    public ServiceResponse forgotPassword(@RequestBody Object user)
    {   
        //logger.debug("getting response");
        return setDataPut("http://localhost:7020/forgotPassword",user);
    } 

user 是具有 json 数据的 Object 类型。现在如何从对象中检索数据并更新我的主体中的名字和姓氏

这是我的 GreenBusUser 课程

public class GreenBusUser  implements UserDetails
{
    private static final long serialVersionUID = 1L;
    private String username;
    private String password;
    private Collection<? extends GrantedAuthority> grantedAuthorities;

    private String firstName;

    private String lastName;

    public GreenBusUser(String username,String password,Collection<? extends GrantedAuthority>  authorities,String firstName, String lastName)
    {
        this.username = username;
        this.password = password;
        this.grantedAuthorities = authorities;
        this.firstName=firstName;
        this.lastName=lastName;

        this.grantedAuthorities.stream().forEach(System.out::println);

    }

    public Collection<? extends GrantedAuthority> getAuthorities()
    {
        return grantedAuthorities;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public String getPassword()
    {
        return password;
    }

    public String getUsername()
    {
        return username;
    }

    public boolean isAccountNonExpired()
    {
        return true;
    }

    public boolean isAccountNonLocked()
    {
        return true;
    }

    public boolean isCredentialsNonExpired()
    {
        return true;
    }

    public boolean isEnabled()
    {
        return true;
    }
}

更新:::::

我已经更新了您的代码并将您的部分答案应用到我的代码中,但我仍然遇到了问题

@RequestMapping(value="/updateUser",method=RequestMethod.GET)
    public String updateUser(ModelMap model) {

        UserInfo user = getUserObject();
        GreenBusUser newGreenBususer = null;
        List<User> list = new ArrayList<User>();


        list = FetchDataService.fetchDataUser("http://localhost:8060/GetuserbyUserName?username=" + getPrincipal(), user.getUsername(), user.getPassword());
        logger.debug("new user list ----->>>"+list.size());
        User newuser=(User)list.get(0);
        UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(
                   SecurityContextHolder.getContext().getAuthentication().getPrincipal(), SecurityContextHolder.getContext().getAuthentication().getCredentials());

        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        newGreenBususer=(GreenBusUser)principal;

        logger.debug("newGreenBususerDetails---->>>"+newGreenBususer.toString());

        newGreenBususer.setFirstName(newuser.getFirstName());
        newGreenBususer.setLastName(newuser.getLastName());

        if(newGreenBususer.getFirstName()!=null) {
            logger.debug("got my first name");
        }
        if(newGreenBususer.getLastName()!=null) {
            logger.debug("got my last name");
        }

        auth.setDetails(newGreenBususer);       
        SecurityContext context = SecurityContextHolder.getContext();
        context.setAuthentication(auth);
        SecurityContextHolder.setContext(context);
        model.addAttribute("user", getPrincipalDisplay());
        model.addAttribute("userData", list);
        model.addAttribute("check", true);
        return "GreenBus_updateProfile_User";
    }

首先它将 firstname 和 lastname 设置为 GreenBusUser,然后当我重新加载页面时出现 setDetails 方法,它显示 No user found当我在这个方法的顶部调用 getUserObject() 方法时。

private X2CUser getUserObject() {
        X2CUser userName = null;
        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

        if (principal instanceof UserDetails) {
            userName = ((X2CUser) principal);
        } else {
            logger.info("No user found");

        }
        return userName;
    }

【问题讨论】:

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


    【解决方案1】:

    如果您要更新密码,最好注销用户并告诉他重新登录。

    【讨论】:

    • 不,假设我只更新了名字和姓氏,那么在这种情况下请告诉我
    【解决方案2】:

    试试这个代码..它可能会帮助你。

    UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass);
    Authentication auth = authManager.authenticate(authReq);
    SecurityContext sc = SecurityContextHolder.getContext();
    securityContext.setAuthentication(auth);
    

    【讨论】:

    • Atul 我不想更新我的用户名,只传递名字和姓氏
    • 是的,一旦您在 DB 中设置了 firstnmae、lastname,将用户名、密码传递给 db 获取详细信息并将该身份验证对象设置为安全上下文
    • 好的,那么我应该在用户中传递什么并作为参数传递呢?你没有得到我没有改变用户名或密码,而是名字和姓氏,我没有在你的答案中看到你在 GreenBusUser 对象中设置名字和姓氏(在添加 setter 之后)
    • 前 2 行将帮助您从数据库中获取数据,然后再次对用户进行身份验证。它将获取更新的详细信息,例如新的名字和姓氏。以及设置身份验证对象的最后一行代码,其中包含您正在寻找的详细信息。无需显式设置。
    【解决方案3】:

    尽管我后来在更新部分的问题部分添加了一些代码,但我终于解决了我的问题。

     Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            newGreenBususer=(GreenBusUser)principal;
    
    
            newGreenBususer.setFirstName(newuser.getFirstName());
            newGreenBususer.setLastName(newuser.getLastName());
    

    是的,这一切都需要完成。

    这部分--->>

        auth.setDetails(newGreenBususer);       
        SecurityContext context = SecurityContextHolder.getContext();
        context.setAuthentication(auth);
        SecurityContextHolder.setContext(context);
    

    设置新的上下文使安全指向 null 当我重新加载时仍然不清楚,因为我正在设置详细信息 before 重新加载所以就像我得到 new context 但我已经设置了新的用户详细信息。

    虽然我终于解决了我的问题,但如果有人能解释为什么会发生这种情况,那么我会接受他/她的回答。

    非常感谢您的支持。继续学习!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多