更新用户的主要名字和姓氏

时间:2018-05-31 09:35:00

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

我正在更新用户的信息,例如名字姓氏,我在欢迎的所有页面中获得名字和姓氏消息

我有两个控制器,一个用于 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);
    } 

用户是对象类型,其中包含 json 数据。现在,我如何从对象中检索数据并更新我的 主要名称和姓氏

这是我的 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;
    }
}

UPDATE :::::

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

@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";
    }

首先将名字和姓氏设置为GreenBusUser ,然后在重新加载页面时出现 setDetails 方法找不到用户当我在此方法的顶部调用 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;
    }

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

试试这段代码..它可能对你有帮助。

Soldier[]

答案 2 :(得分:0)

我终于解决了我的问题,虽然我后来在UPDATE部分的问题部分添加了一些代码。

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


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

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

这部分---&gt;&gt;

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

设置新的上下文,使安全性指向 null ,当我重新加载时仍然不清楚,因为我在重新加载之前设置了详细信息,所以就像我得到新上下文< / strong>但我已设置新的用户详细信息。

虽然我终于解决了我的问题,但是如果有人能说清楚为什么会这样,那么我会接受他/她的回答。

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