为了进一步加强用户体验,提供密码修改功能是必须的。因为密码修改功能更多的是应用在用户名和密码都存到数据库的,所以这里基于内存修改密码不会关注存储机制,更多的会关注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 securityservice; import org.springframework.security.core.userdetails.UserDetailsService; //imports omitted public interface IChangePassword extends UserDetailsService{ void changePassword(String username,String password); }
InMemoryDaoImpl拓展:这里的拓展我们需要保留它之前的方法,而且要实现我们刚拓展的那个修改密码的方法,所以需要继承InMemoryDaoImpl和实现IChangePassword:
package securityDaoImpl; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.memory.InMemoryDaoImpl; import securityservice.IChangePassword; public class InMemoryChangePasswordDaoImpl extends InMemoryDaoImpl implements IChangePassword { public void changePassword(String username,String password) { //get the UsrDetails User userDetails=(User)getUserMap().getUser(username); //creat a new UserDetails with the new password User newUserDetails=new User(userDetails.getUsername(),password,userDetails.isEnabled(),userDetails.isAccountNonExpired(),userDetails.isCredentialsNonExpired(),userDetails.isAccountNonLocked(),userDetails.getAuthorities()); //add to the map getUserMap().addUser(newUserDetails); } }
我们可以看到上面的实现代码,它从存储集合Map里面拿到当前的那个UserDetails凭证,然后创建一个新的UserDetails,修改了密码,然后保存到Map里,覆盖掉之前那个。
这里的拓展代码并不难实现,最主要的是理解它的整个处理流程和设计。
现在已经拓展完了,下一步需要把我们拓展好的类放到security框架中,覆盖掉原有的那个,这需要从配置文件里下手。ps:(这里可能由于每个人的命名空间的不同,所以配置文件的标签会有不一样,不过这并不影响。)
第二步:配置拓展后的UserDetailService到security框架中:
security有提供配置自定义UserDetailService的方法:
<authentication-manager alias="authenticationManager"> <authentication-provider user-service-ref="InMemoryChangePasswordDaoImpl"> </authentication-provider>
如上面代码显示,user-service-ref这个属性就是为了方便开发工程中拓展UserDetailService所提供的。
现在已经将其配置到security里面了,下一步要在配置文件初始化这个bean:
<beans:bean id="InMemoryChangePasswordDaoImpl" class="securityDaoImpl.InMemoryChangePasswordDaoImpl"> <beans:property name="userProperties"> <beans:props> <beans:prop key="guest">guest,ROLE_USER</beans:prop> </beans:props> </beans:property> </beans:bean>
到这一步,基于内存修改密码的功能已经拓展完了,剩下的工作只需要在controller里面调用这个改密的方法就ok了,下面是笔者本人的controller代码(只供参考):
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; @Controller public class ChangePasswordController { @Autowired private 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框架作者的设计思想去拓展,然后就可以水到渠成了。
本文是笔者学习经验所得,仅供参考,希望能帮到有需要的人。
相关推荐
SpringBoot+SpringSecurity+JWT+MybatisPlus实现基于注解的权限验证,可根据注解的格式不同,做到角色权限控制,角色加资源权限控制等,粒度比较细化。 @PreAuthorize("hasAnyRole('ADMIN','USER')"):具有admin或...
**Spring Security 3 系列文章——入门篇(一)** Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,广泛应用于Java企业级应用和Spring Boot项目中。本篇将作为Spring Security 3的入门介绍,帮助...
《基于SpringSecurity的SpringBoot企业级人事管理系统详解》 在当今的互联网开发环境中,SpringBoot以其简洁、高效的特点,已经成为构建后端服务的主流框架。而SpringSecurity作为Spring生态系统中的安全组件,为...
**Spring Security 3 多用户登录实现详解** Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架,广泛应用于Java EE平台上的安全解决方案。在本文中,我们将深入探讨如何在Spring Security 3中实现...
这三份资料——"实战Spring Security 3.x.pdf"、"Spring Security 3.pdf" 和 "Spring Security使用手册.pdf" 将深入探讨这些概念,并提供实践指导,帮助读者掌握如何在实际项目中应用Spring Security。通过学习这些...
Spring Security 是一个强大的安全框架,用于为Java应用提供安全控制。在传统的权限管理中,权限配置通常硬编码在应用程序中,这使得权限调整变得困难,每次变动都需要重新部署应用。然而,通过动态授权,我们可以将...
Spring Security 是一个基于 Java 的安全框架,旨在提供身份验证、授权和访问控制等功能。下面是 Spring Security 的主要知识点: 一、身份验证(Authentication) 身份验证是指对用户身份的验证,以确保用户的...
spring security 基于oauth 2.0 实现 sso 单点登录Demo 使用 spring security 基于oauth 2.0 实现 sso 单点登录Demo spring boot + spring security + spring security oauth
java毕业设计——基于spring boot的音乐播放网站设计与实现(源码+数据库).zip java毕业设计——基于spring boot的音乐播放网站设计与实现(源码+数据库).zip java毕业设计——基于spring boot的音乐播放网站设计与...
该资源是springsecurity+oauth2+jwt实现的单点登录demo,模式为授权码模式,实现自定义登录页面和自定义授权页面。应用数据存在内存中或者存在数据库中(附带数据库表结构),token存储分为数据库或者Redis。demo...
在这个场景中,我们关注的是如何使用Spring Security实现登录验证以及在登录过程中传递参数,特别是记录并返回用户登录前的页面。我们将深入探讨这个过程,并结合MySQL数据库的使用。 首先,让我们了解Spring ...
本项目以"基于spring security + oauth2 + jwt,可优雅集成第三方登录"为主题,旨在提供一个能够无缝整合第三方登录系统的解决方案。 Spring Security是一个强大的安全框架,它为Java和Java EE应用程序提供了全面的...
在“Spring Security 3多用户登录实现之九 基于持久化存储的自动登录”这一主题中,我们将探讨如何利用Spring Security来实现多用户登录系统,并通过持久化存储来支持用户的自动登录功能。在这个过程中,我们会涉及...
通过上述步骤,你已经成功地在Spring Security中实现了自定义的密码加密方式和认证结果处理。在实际项目中,你可能还需要关注其他方面,比如权限控制、记住我功能、CSRF保护等。Spring Security提供了一系列的API和...
### 第三章:高级安全特性 此章节涵盖了更高级的主题,如退出功能的实现、Remember-Me功能及其安全性、修改密码等。这些特性增强了用户会话的安全性和便利性。 ### 第四章:数据驱动的安全管理 本章讨论了如何...
- 如果默认的过滤器不能满足需求,可以编写自定义过滤器,插入到Spring Security的过滤器链中,实现更复杂的逻辑,比如基于URL、方法或自定义条件的权限控制。 5. **JWT令牌**: - 为了支持API的无状态认证,可以...
7. **OAuth2 and JWT支持**:Spring Security 提供了对OAuth2和JSON Web Tokens (JWT) 的支持,这在现代微服务架构中非常重要,因为它允许第三方应用安全地与你的服务进行交互。 8. **表达式语言(SpEL)**:Spring...
- OAuth2:SpringSecurity支持OAuth2协议,实现第三方登录和API保护。 - JWT(JSON Web Tokens):可使用JWT进行状态less的认证,提高系统的可扩展性。 - CORS(Cross-Origin Resource Sharing):SpringSecurity...
Spring Security是一个功能强大、高度定制的安全框架,它专门用于为基于Spring的应用程序提供安全性解决方案。Spring Security架构的设计初衷是为了解决认证和授权的需求,确保应用程序的安全性。它提供了全面的安全...
### Spring Security3中文教程知识点概览 #### 一、安全核心概念与起步 Spring Security是Spring框架中的一个重要组成部分,主要用于为Web应用提供安全防护。它不仅提供了强大的认证和授权功能,还支持各种加密...