`
zhh9106
  • 浏览: 58193 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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 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实现基于注解的权限验证

    SpringBoot+SpringSecurity+JWT+MybatisPlus实现基于注解的权限验证,可根据注解的格式不同,做到角色权限控制,角色加资源权限控制等,粒度比较细化。 @PreAuthorize("hasAnyRole('ADMIN','USER')"):具有admin或...

    Spring Security 3系列文章——入门篇(一)

    **Spring Security 3 系列文章——入门篇(一)** Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,广泛应用于Java企业级应用和Spring Boot项目中。本篇将作为Spring Security 3的入门介绍,帮助...

    springboot项目——基于springSecurity实现的前后端分离的企业级人事管理系统

    《基于SpringSecurity的SpringBoot企业级人事管理系统详解》 在当今的互联网开发环境中,SpringBoot以其简洁、高效的特点,已经成为构建后端服务的主流框架。而SpringSecurity作为Spring生态系统中的安全组件,为...

    Spring Security 3多用户登录实现一

    **Spring Security 3 多用户登录实现详解** Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架,广泛应用于Java EE平台上的安全解决方案。在本文中,我们将深入探讨如何在Spring Security 3中实现...

    Spring Security 资料合集

    这三份资料——"实战Spring Security 3.x.pdf"、"Spring Security 3.pdf" 和 "Spring Security使用手册.pdf" 将深入探讨这些概念,并提供实践指导,帮助读者掌握如何在实际项目中应用Spring Security。通过学习这些...

    spring security实现动态授权

    Spring Security 是一个强大的安全框架,用于为Java应用提供安全控制。在传统的权限管理中,权限配置通常硬编码在应用程序中,这使得权限调整变得困难,每次变动都需要重新部署应用。然而,通过动态授权,我们可以将...

    Spring Security in Action

    Spring Security 是一个基于 Java 的安全框架,旨在提供身份验证、授权和访问控制等功能。下面是 Spring Security 的主要知识点: 一、身份验证(Authentication) 身份验证是指对用户身份的验证,以确保用户的...

    spring security 基于oauth 2.0 实现 sso 单点登录Demo.zip

    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的音乐播放网站设计与实现(源码+数据库).zip java毕业设计——基于spring boot的音乐播放网站设计与...

    springsecurity+oauth2+jwt实现单点登录demo

    该资源是springsecurity+oauth2+jwt实现的单点登录demo,模式为授权码模式,实现自定义登录页面和自定义授权页面。应用数据存在内存中或者存在数据库中(附带数据库表结构),token存储分为数据库或者Redis。demo...

    springSecurity 实现传参

    在这个场景中,我们关注的是如何使用Spring Security实现登录验证以及在登录过程中传递参数,特别是记录并返回用户登录前的页面。我们将深入探讨这个过程,并结合MySQL数据库的使用。 首先,让我们了解Spring ...

    基于spring security + oauth2 + jwt ,可优雅集成第三方登录.zip

    本项目以"基于spring security + oauth2 + jwt,可优雅集成第三方登录"为主题,旨在提供一个能够无缝整合第三方登录系统的解决方案。 Spring Security是一个强大的安全框架,它为Java和Java EE应用程序提供了全面的...

    Spring Security 3多用户登录实现之九 基于持久化存储的自动登录

    在“Spring Security 3多用户登录实现之九 基于持久化存储的自动登录”这一主题中,我们将探讨如何利用Spring Security来实现多用户登录系统,并通过持久化存储来支持用户的自动登录功能。在这个过程中,我们会涉及...

    Spring security 自定义密码加密方式的使用范例。

    通过上述步骤,你已经成功地在Spring Security中实现了自定义的密码加密方式和认证结果处理。在实际项目中,你可能还需要关注其他方面,比如权限控制、记住我功能、CSRF保护等。Spring Security提供了一系列的API和...

    Spring Security3中文文档

    ### 第三章:高级安全特性 此章节涵盖了更高级的主题,如退出功能的实现、Remember-Me功能及其安全性、修改密码等。这些特性增强了用户会话的安全性和便利性。 ### 第四章:数据驱动的安全管理 本章讨论了如何...

    springboot springsecurity动态权限控制

    - 如果默认的过滤器不能满足需求,可以编写自定义过滤器,插入到Spring Security的过滤器链中,实现更复杂的逻辑,比如基于URL、方法或自定义条件的权限控制。 5. **JWT令牌**: - 为了支持API的无状态认证,可以...

    springsecurity学习笔记

    7. **OAuth2 and JWT支持**:Spring Security 提供了对OAuth2和JSON Web Tokens (JWT) 的支持,这在现代微服务架构中非常重要,因为它允许第三方应用安全地与你的服务进行交互。 8. **表达式语言(SpEL)**:Spring...

    SpringSecurity笔记,编程不良人笔记

    - OAuth2:SpringSecurity支持OAuth2协议,实现第三方登录和API保护。 - JWT(JSON Web Tokens):可使用JWT进行状态less的认证,提高系统的可扩展性。 - CORS(Cross-Origin Resource Sharing):SpringSecurity...

    SpringSecurity.pdf

    Spring Security是一个功能强大、高度定制的安全框架,它专门用于为基于Spring的应用程序提供安全性解决方案。Spring Security架构的设计初衷是为了解决认证和授权的需求,确保应用程序的安全性。它提供了全面的安全...

    spring Security3中文教程,经典的

    ### Spring Security3中文教程知识点概览 #### 一、安全核心概念与起步 Spring Security是Spring框架中的一个重要组成部分,主要用于为Web应用提供安全防护。它不仅提供了强大的认证和授权功能,还支持各种加密...

Global site tag (gtag.js) - Google Analytics