`

管理密码集中化

阅读更多

项目需求:把指定的Spring配置文件的指定密码提取出来,用Spring风格的占位符取代。

并把取出的密码集中保存到唯一的properties格式的文件中。

 

完整的项目代码和资源请查看附件。

 

 

build.gradle

apply plugin: 'groovy'

repositories {
	mavenLocal()
    mavenCentral()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.7'
	compile 'org.apache.ant:ant:1.9.4'
    testCompile 'junit:junit:4.11'
	testCompile 'commons-io:commons-io:2.2'

}

sourceSets {
    main {
        groovy {
			srcDirs = ['./src/main/groovy']
			include 'Main.groovy'
        }

    }

    test {
        groovy {
            srcDirs = ['./src/test/groovy']
        }
    }
}

task runScript(type: JavaExec) {
  description 'Run Groovy script'

  // Set main property to name of Groovy script class.
  main = 'Main'

  // Set classpath for running the Groovy script.
  classpath = sourceSets.main.runtimeClasspath
}

defaultTasks 'runScript'

 

Main.groovy

import groovy.util.Node
import groovy.xml.XmlUtil

public class Main{
	public static final String LINE_SEPARATOR = System.getProperty("line.separator")
	boolean extractPassword(Node root, def map){
		boolean update = false
		String beanId 
		String propertyName
		for(def entry: map.entrySet()){
			beanId = entry.key.split('_')[0]
			propertyName = entry.key.split('_')[-1]
			def node = root.find{ it."@id" == beanId }.find{ it."@name" == propertyName }
			String password = node.attribute("value")
			if( password ==~ /\$\{.*?\}/ ){
				println "It's already a place-holder of Spring style. Skip."
				continue
			}
			node."@value" = '${' + entry.key + '}'
			entry.value = password
			update = true
			//println XmlUtil.serialize(node)		
		}
		return update
	}
	
	void saveXml(String fileName, Node xml){
		def writer = new FileWriter(fileName)
		def printer = new XmlNodePrinter(new PrintWriter(writer))
		printer.preserveWhitespace = true
		printer.print(xml)
		
	}
	
	void saveSstsConfiguration(String fileName, def map){
		File file = new File(fileName)
		Properties props = new Properties()
		file.withInputStream{ stream ->
  		  props.load(stream)		   
		}	
		boolean update = false
		map.entrySet().each{ entry->
			if(props[entry.key] == null){
				if( !(entry.value ==~ /\$\{.*?\}/) ){
					file.append(LINE_SEPARATOR + "${entry.key}=${entry.value}")
					update = true
				}
			}
		}
		if(update){
			file.append(LINE_SEPARATOR)
		}
	}
	
	static main(args){
		Main obj = new Main()
	
		String fileName = "./src/main/resources/Spring-Config.xml"
		def map = ["database_password":"", "sybase_password":""]

		File file = new File(fileName)
		Node root = new XmlParser().parseText(file.getText())
		boolean update = obj.extractPassword(root, map)
		if(update){
			new AntBuilder().copy( file:fileName, tofile:fileName + "_Bak")
			obj.saveXml(fileName, root)
			String sstsConfiguration = "./src/main/resources/ssts.configuration"
			new AntBuilder().copy( file:sstsConfiguration, tofile:sstsConfiguration + "_Bak")
			obj.saveSstsConfiguration(sstsConfiguration, map)
		}else{
			println "No update and no replication."
		}

		println map
	
	}
}

 

MainTest.groovy

import org.junit.*
import static org.junit.Assert.*
import org.apache.commons.io.FileUtils
import groovy.util.AntBuilder
import groovy.xml.XmlUtil
import groovy.util.Node
import org.apache.commons.io.FileUtils



class MainTest {
	private obj = null

	static final String input = '''<beans xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <bean id="database" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=gbk"/>
    <property name="username" value="root"/>
    <property name="password" value="sa"/>
  </bean>
  <bean id="sybase" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=gbk"/>
    <property name="username" value="root"/>
    <property name="password" value="ind_suezssts"/>
  </bean>
</beans>
'''

	static final String target = '''<beans xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <bean id="database" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=gbk"/>
    <property name="username" value="root"/>
    <property name="password" value="${database_password}"/>
  </bean>
  <bean id="sybase" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=gbk"/>
    <property name="username" value="root"/>
    <property name="password" value="${sybase_password}"/>
  </bean>
</beans>
'''
	static def map = null

    static Node root 
	static Node xml

	
	@BeforeClass
	public static void enter(){
	}

	
	@Before
	public void setUp(){
		root = new XmlParser().parseText(input)
		xml = new XmlParser().parseText(target)	
		obj = new Main()
		map = ["database_password":"", "sybase_password":""]

	}

	@Test
	public void extractPasswordReturnTrue(){
		boolean result = obj.extractPassword(root, map)
		def mymap = ["database_password":"sa", "sybase_password":"ind_suezssts"]
		assertTrue result
		assertEquals mymap,map
		assertEquals XmlUtil.serialize(xml), XmlUtil.serialize(root)
	}
	
	@Test
	public void extractPasswordReturnFalse(){
		Node myxml = new XmlParser().parseText(target)	
		boolean result = obj.extractPassword(xml, map)
		def mymap = ["database_password":"", "sybase_password":""]
		assertFalse result
		assertEquals mymap,map
		assertEquals XmlUtil.serialize(myxml), XmlUtil.serialize(xml)
	}	
	
	@Test
	public void saveXml(){
		//String fileName, Node xml
		String fileName = "./src/test/resources/test-A.xml"
		new File(fileName).delete()
		obj.saveXml(fileName, xml)
		assertTrue new File(fileName).exists()
		Node myxml = new XmlParser().parseText(new File(fileName).getText())	
		assertEquals XmlUtil.serialize(myxml), XmlUtil.serialize(xml)

	}
	//	void saveSstsConfiguration(String fileName, def map){
	@Test
	public void saveSstsConfiguration(){
		String fileName = "./src/test/resources/ssts.configuration.test"
		String fileTarget = "./src/test/resources/ssts.configuration.target"
		new File(fileName).write("")
		boolean result = obj.extractPassword(root, map)
		obj.saveSstsConfiguration(fileName, map)
		assertEquals(FileUtils.readLines(new File(fileName)), FileUtils.readLines(new File(fileTarget)));

	}
	
	
	
}

 

 

项目结构:

G:\share\groovy\centralize-password>tree
卷 DOC 的文件夹 PATH 列表
卷序列号为 9AC5-4EB7
G:.
├─src
│  ├─main
│  │  ├─groovy
│  │  └─resources
│  └─test
│      ├─groovy
│      └─resources
 
0
1
分享到:
评论

相关推荐

    CISCO网络设备的集中化管理

    ### CISCO网络设备的集中化管理 随着网络规模的不断扩大和技术的发展,对于网络设备的管理也提出了更高的要求。为了提高管理效率、降低运维成本,并确保网络的安全性与稳定性,集中化管理成为了一种趋势。本篇文章...

    个人密码管理系统

    个人密码管理系统通过将这些密码集中加密存储,减轻了记忆负担,同时增强了账户的安全性。 系统采用C++编程语言实现,C++是一种强大且灵活的面向对象编程语言,具有高效执行和良好移植性的特点,适用于开发这种对...

    密码管理(数据加密)

    首先,密码管理是通过集中化的方式,帮助用户妥善存储和管理众多账号的登录密码。这通常涉及到使用密码管理器,一个能够创建强密码、自动填充登录信息以及安全存储密码的应用程序。对于记性不好的人来说,它极大地...

    个人密码管理器(离线版)

    首先,这款密码管理器的核心功能是存储和管理密码。它允许用户创建一个主密码,通过这个主密码,您可以解锁存储的所有其他密码。主密码的重要性不言而喻,选择一个既复杂又易于记忆的主密码是首要任务。密码管理器...

    启动脚本统一修改管理员密码

    通过编写启动脚本实现自动化的密码更新,可以极大地减少系统管理员的工作负担,并确保系统的安全性。 #### 实现方法详解 下面将详细介绍如何通过启动脚本实现域客户机管理员密码的统一修改: 1. **脚本语言的...

    完美的跨平台账号密码管理工具

    总之,跨平台账号密码管理工具是现代网络生活中不可或缺的安全辅助工具,它们通过集中管理、强加密和自动化登录等方式,帮助用户保护在线身份的安全,提高网络生活的效率。1Password作为其中的一员,以其出色的功能...

    效能密码管理器专业版

    这款软件旨在解决这一问题,提供一个集中化的平台来存储、管理和保护用户的密码。 在【描述】中提到,“安装后运行补丁”,这指的是用户在完成软件安装后,需要应用一个补丁程序以激活其专业版功能。补丁通常用于...

    个人密码管理系统 01

    此系统的核心功能在于提供一个加密存储的平台,使得用户能够集中管理自己的网络账户信息,同时保护这些敏感数据免受未经授权的访问。 在Java Swing中构建此类应用涉及以下主要知识点: 1. **Swing组件库**:Swing...

    密码管理器

    密码管理器解决了这个问题,它允许用户创建一个集中的、加密的安全库,将所有的用户名和密码保存在一个地方。 这款特定的密码管理器使用了“账号类型”作为标识符,让用户可以轻松地分类和查找他们的账户。例如,...

    密码管理软件

    1. **密码存储**:KeePass允许用户将所有密码集中存储在一个加密的数据库中,这个数据库称为"密码库"。用户只需要记住一个主密码就可以解锁整个密码库,大大简化了密码管理。 2. **加密技术**:KeePass使用先进的...

    HMC V8如何重置hscroot密码

    HMC V8 是 IBM 服务器管理平台的一部分,提供了集中化的服务器管理功能。在 HMC V8 中,hscroot 用户是系统管理员的默认用户名,拥有最高权限。因此,hscroot 用户密码的安全性至关重要。本文将详细介绍如何重置 HMC...

    密码查看器.

    它通常具有安全性和易用性的特点,旨在为用户提供一个集中化的平台来管理和保护他们的数字身份。下面将详细介绍密码查看器的功能、工作原理以及相关知识点。 **1. 功能** 1. **密码解密与查看**:密码查看器能够...

    金钥匙密码管理

    4. **多设备同步**:支持多设备间的同步,用户可以在手机、平板或电脑上随时查看和管理密码,只需一个主密码即可解锁所有设备上的数据。 5. **分组管理**:用户可以将不同的账号按类别分组,如社交、银行、购物等,...

    行业分类-设备装置-密码资源池、密码资源池管理方法、管理平台及管理系统.zip

    管理系统则是管理平台的扩展,它可能包括一系列工具和服务,如自动化密码轮换、自动化的密码更新策略执行、与现有业务系统的集成等。这些工具和服务旨在简化密码管理流程,减少人为错误,同时提升系统的整体安全性。...

    QPass 1.3.2 老朽痴拙汉化版(密码管理器qt)

    QPass允许用户将这些信息集中存储在一个加密的数据库中,通过一个主密码来保护整个数据库的安全。这样,用户只需记住一个主密码,而无需记住所有其他复杂的登录信息。 这款密码管理器支持创建、编辑和删除密码条目...

    360网神&奇安信虚拟化安全V7.0用户手册.docx

    该系统提供了集中化的安全管理、实时监控、自动化防御等功能,能够有效防止各种攻击和恶意行为。 设计理念 360网神虚拟化安全管理系统的设计理念是基于虚拟化技术的安全需求,旨在提供一个安全、可靠、可扩展的...

    keypass,密码管理软件

    Keypass提供了一个集中式的解决方案,使得这些密码的保存和访问变得轻松便捷。 一、密码管理的重要性 在当今网络环境中,保护个人信息和账户安全至关重要。使用相同的密码或弱密码会增加被黑客攻击的风险。因此,...

    远程集中管理源码.rar

    总的来说,“远程集中管理源码.rar”提供了一个学习和理解远程管理技术的实践平台,特别是涉及到MSTSC和Radmin的使用、安全的密码处理、以及自动化登录机制。通过分析和研究这些源码,开发者和IT专业人员可以深入...

    AD组策略使用技巧-用域策略+脚本实现客户端管理员帐号密码统一更改

    这一步骤确保了所有目标计算机都处于同一个管理策略下,便于集中管理和配置。 #### 知识点四:配置组策略以执行脚本 - **步骤1**:在“更改密码”组织单位上创建一个新的组策略对象(GPO),命名为“admin”。 - **...

Global site tag (gtag.js) - Google Analytics