06【掌握】散列算法+凭证配置

一、散列算法

散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法有MD5,SHA等。一般进行散列时最好提供一个salt(盐),比如

使用MD5加密后的结果:e10adc3949ba59abbe56e057f20f883e
使用MD5加密并加盐后的结果:19a45a53e8924a742f77183b8878a5fb
使用MD5加密加盐并散列两次后的结果:b4f48723743cc5bfa7c1716296703ce1

简单的可以破解出来https://cmd5.com/,但是原则不可逆。
在这里插入图片描述

1、散列算法工具类

package com.sxt.utils;

import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.crypto.hash.Sha1Hash;

public class MD5Utils {
    public static void main(String[] args) {

        String source = "123456";

        Md5Hash hash1 = new Md5Hash(source);
        System.out.println(hash1);//e10adc3949ba59abbe56e057f20f883e

        Md5Hash hash2 = new Md5Hash(source,"武汉");
        System.out.println("MD5加密并且加盐的结果:"+hash2);//3ca8b47ced5ea7588c917c52a3ccbdd7

        Md5Hash hash3 = new Md5Hash(source,"武汉",2);
        System.out.println("MD5加密并且加盐并且加密两次的结果:"+hash3);//a289a660a2c4521bb2894445a7e77667

        Sha1Hash hash4 = new Sha1Hash("123456");
        System.out.println(hash4);
    }



    /**
     * 工具类1:使用Md5Hash对密码进行加密
     * @param source    要加密的明文
     * @param salt      盐
     * @param hashIterations    散列次数
     * @return
     */
    public static String md5(String source,Object salt,Integer hashIterations){
        return new Md5Hash(source,salt,hashIterations).toString();
    }

    /**
     * 工具类2:使用Sha1Hash对密码进行加密
     * @param source    要加密的明文
     * @param salt      盐
     * @param hashIterations    散列次数
     * @return
     */
    public static String sha1(String source,Object salt,Integer hashIterations){
        return new Sha1Hash(source,salt,hashIterations).toString();
    }
}

二、凭证配置

1、方式1

(1)无ini文件

(2)UserRealm.java

//public class UserRealm extends AuthenticatingRealm {
public class UserRealm extends AuthorizingRealm {

	private UserService userService=new UserServiceImpl();
	private RoleService roleService=new RoleServiceImpl();
	private PermissionService permissonService=new PermissionServiceImpl();

	public UserRealm(){
		//注册凭证匹配器
		HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
		//指定加密算法
		credentialsMatcher.setHashAlgorithmName("md5");
		credentialsMatcher.setHashIterations(2);//设置散列次数
		setCredentialsMatcher(credentialsMatcher);
	}


	/**
	 * 做认证
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		//可以获取用户传递过来的数据,用户名,密码
		String username=token.getPrincipal().toString();
		String password = new String((char[])token.getCredentials());

		//封装用户,角色,权限对象
		User user=userService.queryUserByUserName(username);
		Collection<String> roles = roleService.queryRoleByUserName(username);
		Collection<String> permissions = permissonService.queryPermissionByUserName(username);
		ActiverUser activerUser = new ActiverUser(user,roles,permissions);


		/**
		 * 以前登陆的逻辑是  把用户和密码全部发到数据库  去匹配
		 * 在shrio里面是先根据用户名把用户对象查询出来,再来做密码匹配
		 */

		if(null!=user) {
			/**
			 * 参数说明
			 * 参数1:可以传到任意对象
			 * 参数2:从数据库里面查询出来的密码
			 * 参数3:当前类名
			 */
			//SimpleAuthenticationInfo info=new SimpleAuthenticationInfo(activerUser, user.getPwd(), this.getName());
			/**
			 * 参数说明
			 * 参数1:可以传到任意对象
			 * 参数2:从数据库里面查询的散列之后密码
			 * 参数3:盐
			 * 参数4:当前类名
			 */
			ByteSource credentialsSalt =ByteSource.Util.bytes( "武汉");
			SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(activerUser,user.getPwd(),credentialsSalt,this.getName());
			return info;
		}else {
			//用户不存在  shiro会抛 UnknowAccountException
			return null;
		}
	}

	@Override//做授权
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
		SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
		ActiverUser activerUser = (ActiverUser) principalCollection.getPrimaryPrincipal();

		//添加角色和权限在info中
		if (activerUser.getRoles()!=null&&activerUser.getRoles().size()>0){
			info.addRoles(activerUser.getRoles());
		}
		if (activerUser.getPermission()!=null&&activerUser.getPermission().size()>0){
			info.addStringPermissions(activerUser.getPermission());
		}

		/*//如果是root,则授予所有权限
		if (activerUser.getUser().getType()==0){
			info.addStringPermission("*:*");
		}*/
		return info;
	}
}

(3)main方法

public class TestAuthenticationApp {
	// 日志输出工具
	private static final transient Logger log = LoggerFactory.getLogger(TestAuthenticationApp.class);

	public static void main(String[] args) {


		String username = "zhangsan";
		String password = "123456";

		log.info("My First Apache Shiro Application");
		// 1、创建安全管理器的工厂对象 org.apache.shiro.mgt.SecurityManager;不能使用java.lang.SecurityManager
		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");

		// 2、使用工厂创建安全管理器DefaultSecurityManager(不同)
		DefaultSecurityManager securityManager = (DefaultSecurityManager) factory.getInstance();

		 //3、创建UserRealm
		UserRealm realm = new UserRealm();
				注册凭证匹配器
				//HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
				//指定加密算法
				//credentialsMatcher.setHashAlgorithmName("md5");
				设置散列次数
				//credentialsMatcher.setHashIterations(2);
				//realm.setCredentialsMatcher(credentialsMatcher);
		// 4、给securityManager注入userRealm
		securityManager.setRealm(realm);

		// 6、把当前的安全管理器绑定当到线的线程
		SecurityUtils.setSecurityManager(securityManager);
		// 7、使用SecurityUtils.getSubject得到主体对象
		Subject subject = SecurityUtils.getSubject();
		// 8、封装用户名和密码
		AuthenticationToken token = new UsernamePasswordToken(username, password);
		// 9、得到认证

		try {
			subject.login(token);
			System.out.println("认证通过");

			//用于接收UserRealm中SimpleAuthenticationInfo方法的第一个参数Object
			//Object principal = subject.getPrincipal();
			//System.out.println(principal);
		} catch (IncorrectCredentialsException e) {
			System.out.println("密码不正确");
		} catch (UnknownAccountException e) {
			System.out.println("用户名不存在");
		}
		//判断是否有role1角色
		boolean hasRole1 = subject.hasRole("role1");
		System.out.println("是否有role1的角色:"+hasRole1);

		//判断是否有user:query权限
		boolean b = subject.isPermitted("user:query");
		System.out.println("是否有user:query的角色:"+b);

	}

}
/**
 * 在spring里面如何配置
 * 1,配置凭证匹配器
 * <bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
 * 	<property name="hashAlgorithmName" value="md5">
 * 	<property name="hashIterations" value="2">
 * </bean>
 * 2,配置realm
 * <bean id="realm" class="com.sxt.realm.UserRealm">
 *    <property name="credentialsMatcher" ref="credentialsMatcher">
 * </bean>
 * 3,配置SecurityManager
 * <bean id="securityManager" class="org.apache.shiro.mgt.DefaultSecurityManager">
 * 	<propery name="realm" ref="realm">
 * </bean>
 * 
 * 
 */

2、方式2

(1)无ini文件

(2)主方法

public class TestAuthenticationApp {
	// 日志输出工具
	private static final transient Logger log = LoggerFactory.getLogger(TestAuthenticationApp.class);

	public static void main(String[] args) {


		String username = "zhangsan";
		String password = "123456";

		log.info("My First Apache Shiro Application");
		// 1、创建安全管理器的工厂对象 org.apache.shiro.mgt.SecurityManager;不能使用java.lang.SecurityManager
		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");

		// 2、使用工厂创建安全管理器DefaultSecurityManager(不同)
		DefaultSecurityManager securityManager = (DefaultSecurityManager) factory.getInstance();

		 //3、创建UserRealm
		UserRealm realm = new UserRealm();
				//注册凭证匹配器
				HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
				指定加密算法
				credentialsMatcher.setHashAlgorithmName("md5");
				//设置散列次数
				credentialsMatcher.setHashIterations(2);
				realm.setCredentialsMatcher(credentialsMatcher);
		// 4、给securityManager注入userRealm
		securityManager.setRealm(realm);

		// 6、把当前的安全管理器绑定当到线的线程
		SecurityUtils.setSecurityManager(securityManager);
		// 7、使用SecurityUtils.getSubject得到主体对象
		Subject subject = SecurityUtils.getSubject();
		// 8、封装用户名和密码
		AuthenticationToken token = new UsernamePasswordToken(username, password);
		// 9、得到认证

		try {
			subject.login(token);
			System.out.println("认证通过");

			//用于接收UserRealm中SimpleAuthenticationInfo方法的第一个参数Object
			//Object principal = subject.getPrincipal();
			//System.out.println(principal);
		} catch (IncorrectCredentialsException e) {
			System.out.println("密码不正确");
		} catch (UnknownAccountException e) {
			System.out.println("用户名不存在");
		}
		//判断是否有role1角色
		boolean hasRole1 = subject.hasRole("role1");
		System.out.println("是否有role1的角色:"+hasRole1);

		//判断是否有user:query权限
		boolean b = subject.isPermitted("user:query");
		System.out.println("是否有user:query的角色:"+b);

	}
	/**
	 * 在spring里面如何配置
	 * 1.配置
	 */
}

/**
 * 在spring里面如何配置
 * 1,配置凭证匹配器
 * <bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
 * 	<property name="hashAlgorithmName" value="md5">
 * 	<property name="hashIterations" value="2">
 * </bean>
 * 2,配置realm
 * <bean id="realm" class="com.sxt.realm.UserRealm">
 *    <property name="credentialsMatcher" ref="credentialsMatcher">
 * </bean>
 * 3,配置SecurityManager
 * <bean id="securityManager" class="org.apache.shiro.mgt.DefaultSecurityManager">
 * 	<propery name="realm" ref="realm">
 * </bean>
 * 
 * 
 */

3、方式3

(1)ini文件

[main]
##创建凭证匹配器
credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
credentialsMatcher.hashAlgorithmName=md5
credentialsMatcher.hashIterations=2

##HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
##指定加密算法
##credentialsMatcher.setHashAlgorithmName("md5");
##credentialsMatcher.setHashIterations(2);//设置散列次数
##setCredentialsMatcher(credentialsMatcher);

##创建userRealm对象
userRealm=com.sxt.realm.UserRealm
##给userRealm注入凭证匹配器
userRealm.credentialsMatcher=$credentialsMatcher

##把当前对象给安全管理器
##securityManager=org.apache.shiro.mgt.DefaultSecurityManager
securityManager.realm=$userRealm

(2)主方法

public static void main(String[] args) {


		String username = "zhangsan";
		String password = "123456";

		log.info("My First Apache Shiro Application");
		// 1、创建安全管理器的工厂对象 org.apache.shiro.mgt.SecurityManager;不能使用java.lang.SecurityManager
		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");

		// 2、使用工厂创建安全管理器DefaultSecurityManager(不同)
		DefaultSecurityManager securityManager = (DefaultSecurityManager) factory.getInstance();

		 //3、创建UserRealm
		//UserRealm realm = new UserRealm();
				注册凭证匹配器
				//HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
				//指定加密算法
				//credentialsMatcher.setHashAlgorithmName("md5");
				设置散列次数
				//credentialsMatcher.setHashIterations(2);
				//realm.setCredentialsMatcher(credentialsMatcher);
		// 4、给securityManager注入userRealm
		//securityManager.setRealm(realm);

		// 6、把当前的安全管理器绑定当到线的线程
		SecurityUtils.setSecurityManager(securityManager);
		// 7、使用SecurityUtils.getSubject得到主体对象
		Subject subject = SecurityUtils.getSubject();
		// 8、封装用户名和密码
		AuthenticationToken token = new UsernamePasswordToken(username, password);
		// 9、得到认证

		try {
			subject.login(token);
			System.out.println("认证通过");

			//用于接收UserRealm中SimpleAuthenticationInfo方法的第一个参数Object
			//Object principal = subject.getPrincipal();
			//System.out.println(principal);
		} catch (IncorrectCredentialsException e) {
			System.out.println("密码不正确");
		} catch (UnknownAccountException e) {
			System.out.println("用户名不存在");
		}
		//判断是否有role1角色
		boolean hasRole1 = subject.hasRole("role1");
		System.out.println("是否有role1的角色:"+hasRole1);

		//判断是否有user:query权限
		boolean b = subject.isPermitted("user:query");
		System.out.println("是否有user:query的角色:"+b);

	}
}

/**
 * 在spring里面如何配置
 * 1,配置凭证匹配器
 * <bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
 * 	<property name="hashAlgorithmName" value="md5">
 * 	<property name="hashIterations" value="2">
 * </bean>
 * 2,配置realm
 * <bean id="realm" class="com.sxt.realm.UserRealm">
 *    <property name="credentialsMatcher" ref="credentialsMatcher">
 * </bean>
 * 3,配置SecurityManager
 * <bean id="securityManager" class="org.apache.shiro.mgt.DefaultSecurityManager">
 * 	<propery name="realm" ref="realm">
 * </bean>
 * 
 * 
 */
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CAD门窗幕墙辅助设计软件是一款基于AutoCAD 基础二次开发的针对于门窗幕墙辅助设计的工具系统。本软件适用于AutoCAD2006-2010 中文版,包含绘图环境设置、绘图工具、编辑工具、图层管理工具、门窗幕墙构件校核、截面特性计算、文本与尺寸标注、批量打印与目录生成、门窗幕墙分格生成等分项,各分项下共有近九十个专用工具。 一、绘图工具 1. 焊缝 2. 岩棉 3. 垫块 4. 角码 5. 标高符号 6. 条形孔 7. 画爪点 8. 插入索引 9. 累加编号 10. 水平均分辅助线 11. 垂直均分辅助线 12. 均分辅助线 二、编辑工具 1. 目录编辑 2. 元素全改为白色 3. 按图框调整比例 4. Z坐标置零 5. 左对齐 6. 右对齐 7. 底对齐 8. 顶对齐 9. 水平中间对齐 10. 垂直中间对齐 三、图层工具 1. 图层切换开 2. 图层切换关 3. 图层匹配 4. 按对像调整图层 5. 关闭图层 6. 打开所有图层 7. 锁定图层 8. 解锁图层 9. 解冻所有图层 四、 文本标注工具 1. 直线标注 2. 块名标注 3. 块对应文本标注 4. 块文本库修改 五、尺寸标注工具 1. 三点弧长标注 2. 等分连续标注 3. 标注文本修改 六、幕墙校核 1. 荷载计算 2. 立柱-简支梁 3. 立柱-双跨梁 4. 立柱-多跨铰接 5. 横梁 6. 四边简支玻璃 7. 四点支承玻璃 8. 结构胶 9. 玻璃肋 10. 石材面板 11. 铝板 12. 悬臂梁计算 13. 生成ansys命令流 七、幕墙分格 1. 幕墙杆件 2. 明隐互换 3. 自定义幕墙分格 4. 开启线 5. 幕墙尺寸标注 八、门窗校核 1. 窗中梃校核 2. 窗中横校核 九、门窗分格 1. 窗外框 2. 中梃 3. 窗扇 4. 转角 5. 更改构件属性 6. 窗分格自动标注 十、统计工具 1. 长度求和 2. 面积统计 3. 多面积求和 4. 文本与块统计 5. 重叠块查找 十一、填充工具 1. 对角填充 2. 多点填充 十二、打印工具 1. 批量打印 2. 高级批量打印 十三、其它 1. 图库 2. 铰链运行 3. 修改百科型材数据库 4. 表格导出 5. 导出dxf文件 6. 截面特性 7. 关于 十四、功能订制
绿色版,直接解压即可,打开后按提示添加授权许可即可正常使用 智点木门软件特点: 一、针对性强:特别针对于门业非标件多的特点设计,适用于所有门型,如果后期开发了新品种或工艺改变,操作人员即可快速完成工艺的增加、修改等操作。所以本软件真正做到,一次投资,终身受益。 二、功能齐全:包含了从订单到货运的整个流程,流程灵活可自定义设置。 三、使用方便:软件具有自定义界面及自定义报表功能,可按客户原有的工作习惯设置录入界面及报表格式,使用方便。 四、单据自动传递:订单中录入参数后,后面的生产、发货、收款均只要选择订单即可。 五、方便操作人员:软件的功能足够强大,但对操作人员的要求却实在少,就算您从来没有碰过电脑,就算您对拼音是什么都搞不懂,我们也只要培训您几天就可以熟练使用了,因为我们的软件基本上已配置好了常用的设置。 六、方便公司领导:只要可以上网,您在家,在车上,甚至在国外,您都可以操作,“看到”公司里生产,销售,帐务,工人工资等等所有情况,和您亲自在公司也没有多少差别,该软件也支持您的工作人员进行多人同时在线同时操作或分权限操作。 七、方便客户:只要可以上网,客户或您的销售商在家就可以直接下单到公司,并可以看到他的订单的进度和管理查询属于他自己的所有订单。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值