springsecurity第三章——实现基于内存修改密码
为了进一步加强用户体验,提供密码修改功能是必须的。因为密码修改功能更多的是应用在用户名和密码都存到数据库的,所以这里基于内存修改密码不会关注存储机制,更多的会关注security框架本身对这种方式的拓展的整体流程和设计。
security框架中提供了一个UserDetailService的实现类InMemoryDaoImpl的类来管理内存用户,它的内存凭证存储使用了一个Map来存储内存中的用户和所关联的UserDetails。而这个UserDetails的实现类,security已经封装好了——o.s.s.core.userDetails.User。
既然我们知道了是InMemoryDaoImpl来管理内存中的用户,那我们只需要对UserDetailService以及它的实现类InMemoryDaoImpl进行拓展就可以达到密码修改的功能了。
?
首先我们需要做的是拓展UserDetailService以及它的实现类InMemoryDaoImpl,拓展完成之后,我们就想办法把我们拓展后的类覆盖掉security框架中原有的处理类。
?
第一步,拓展UserDetailService和InMemoryDaoImpl:
UserDetailService拓展:我们需要一个修改密码的方法,而UserDetailService是不具有的,所以我们需要创建一个继承了UserDetailService的类IChangePassword:
package controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.core.context.SecurityContextHolder;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import securityservice.IChangePassword;@Controllerpublic class ChangePasswordController {@Autowiredprivate IChangePassword iChangePasswordDao;@RequestMapping(value="/changePassword",method=RequestMethod.POST)public String changePassword(@RequestParam("newPassword") String newpassword,@RequestParam("oldPassword") String oldpassword){Object principal =SecurityContextHolder.getContext().getAuthentication().getPrincipal();String username=principal.toString();if(principal instanceof UserDetails){username=((UserDetails)principal).getUsername();}//if(((UserDetails)principal).getPassword().equals(oldpassword))//{iChangePasswordDao.changePassword(username, newpassword);//}return "redirect:home.jsp";}}
?
到这里,整个后台过程已经拓展完了,其实这里的拓展并不难,主要还是要理解其整体的处理流程和设计方法,然后按照security框架作者的设计思想去拓展,然后就可以水到渠成了。
?
本文是笔者学习经验所得,仅供参考,希望能帮到有需要的人。
?
?
?
?