一、shiro 加密?
/*
Shiro?
一、为什么要加密?
  为调高数据库的安全性,需要给密码加密。 二、常见的加密算法?
1.1哈希算法
md5:加密算法 哈希函数
1.2.对称算法
1.3.非对称算法 三、如何进行加密后的匹配?
注册用户-----获取用户对象----密码加密---存数据库 四.如何匹配?
对密码先加密----匹配
token :前台穿过来的密码(未加密)
join:数据库中已经加密的密码
*/

二、实现。

在shiro.xml中1.开启密码匹配器

       2.logout 注销 设置一个注销的方法,可以清除session中缓存。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--1.安全管理器-->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!--缓存管理器 暂时不引用他-->
<!--<property name="cacheManager" ref="cacheManager"/>--> <!--会话的模式-->
<property name="sessionMode" value="native"/> <!--配置realm -->
<property name="realm" ref="myRealm"/>
</bean> <!--2.缓存管理器-->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"> </bean> <bean id="myRealm" class="com.aaa.realm.MyRealm">
<property name="name" value="myRealm"/> <!--3.品证(密码)匹配器-->
<property name="credentialsMatcher"> <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"> <!--加密算法的名称 -->
<property name="hashAlgorithmName" value="MD5"/>
<!-- 是否让它 进行16进制的编码 -->
<property name="storedCredentialsHexEncoded" value="true"/>
<!-- 迭代的次数 123。。。。加密 。。。。加密 1024 次 叫做迭代。 -->
<!--<property name="hashIterations" value="1024"/>-->
</bean>
</property>
</bean> <!--4.shiro中的类型要交给 spring容器管理的bean-->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> <!--5.启用注解配置-->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean> <!-- 6. shiro 的过滤器 id和名字保持一致 和web.xml 中过滤器的名字保持一致。否则配置没有效果。 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!--1.引入安全管理器 -->
<property name="securityManager" ref="securityManager"/> <!--2.登录的地址 -->
<property name="loginUrl" value="/login.jsp"/> <!--3.登录成功的页面 -->
<property name="successUrl" value="/index.jsp"/> <!--4.绑定一个未授权的路径。-->
<property name="unauthorizedUrl" value="/unauthorized.jsp"/> <!-- <property name="filters">
<util:map>
<entry key="aName" value-ref="someFilterPojo"/>
</util:map> filterChainDefinitions 过滤器的规则声明。
1.anon 匿名不需要验证
2. authc 认证 需要登录
3.perms 权限
4.logout 注销 设置一个注销的方法,可以清楚session中缓存。 /admin/** = authc 下的路径都需要进行登录认证 从上到下 前面规定好的 冲突就是优先级。
</property> -->
<property name="filterChainDefinitions">
<value>
/login.jsp = anon
/index.jsp = anon
/static/** =anon
/logout=logout
# allow WebStart to pull the jars for the swing app:
/*.jar = anon
# everything else requires authentication:
/dept/**=authc
/admin/** = authc
</value>
</property>
</bean> </beans>

3.index.jsp 添加注销的超链连。

<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/8/5
Time: 10:04
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>mvc</title>
</head>
<body>
<a href="view/addcaidan.jsp">菜单录入</a><br> <a href="admin/empdemo.jsp">admin路径下的 员工管理的查询 录入 删除</a><br> <a href="admin/empdemo1.jsp">admin路径下的 员工系统的增删改查</a><br> <a href="admin/wenjianshangchuang.jsp">admin路径下的 通过表单上传数据</a><br> <a href="view/wenjiango.jsp"> 单个文件</a><br> <a href="login.jsp"> 登录验证测试</a><br> <a href="view/duowenjian.jsp"> 多文件上传</a><br> <%-- 在shiro中配置一个注销的设置 在首页直接点击注销 就能注销session--%>
<a href="logout">注销</a><br> </body>
</html>

三、简单的加密方式?

2.1token 前台传过来的密码是没有加密的,通过shiro去加密,然后再匹配。

2.2info 中的原始密码,通过加密的方式,加密,得到一列字符串

2.3 在这里 我只对密码进行了限制是 666 ,用户名,可以随便输入

package com.aaa.realm;

import org.apache.shiro.authc.*;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.realm.AuthenticatingRealm;
import org.apache.shiro.util.ByteSource; /*1.编码实现realm类
* 2.继承AuthenticatingRealm
*
* 3.返回一个实现类 验证交给shiro
*
* realm
*
* 1.获取subject传递过来的token
* 2.根据token中的用户名,找到密码
* 3.返回认证的对象。
* */
public class MyRealm extends AuthenticatingRealm {
@Override //令牌信息 从表单中传递过来的身份信息
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { UsernamePasswordToken usernamePasswordToken= (UsernamePasswordToken) authenticationToken;
//获取令牌中的用户名
String username = usernamePasswordToken.getUsername(); //连接数据库 进行查询操作 根据用户名 查询密码 模拟密码
// String password="666"; String password="fae0b27c451c728867a567e8c1bb4e53"; //数据库中加密后的密码 模拟获取 SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username,password,getName());
return info;
} public static void main(String[] args) {
// String username="admin";
// String password="123";
//算法的名称 和 原始密码
SimpleHash simpleHash = new SimpleHash("MD5","666" ); //得到 加密后的数据 fae0b27c451c728867a567e8c1bb4e53
String s = simpleHash.toHex();
System.out.println(s); }
}

四。增添盐值  salt  ,根据名字进行加密。

为什么?  

在数据库中,不同的用户,可能存在相同的密码,这也是不安全的。---------》salt解决问题。

package com.aaa.realm;

import com.aaa.util.MD5Utils;
import org.apache.shiro.authc.*;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.realm.AuthenticatingRealm;
import org.apache.shiro.util.ByteSource; public class MyRealm extends AuthenticatingRealm {
@Override //令牌信息 从表单中传递过来的身份信息
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { UsernamePasswordToken usernamePasswordToken= (UsernamePasswordToken) authenticationToken;
//获取令牌中的用户名
String username = usernamePasswordToken.getUsername(); String password="0668410aa0944d32908ca1fd66890c92"; //数据库中加密的密码
// 1.这里也要加上盐值 和下面匹配。 2.用户名充当盐值,不固定,不要把用户名写死。 username代替。
ByteSource salt = ByteSource.Util.bytes(username); //返回认证信息 添加一个 密码加密 salt 用户名 散列的密码 盐值,用户名
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username,password,salt,getName());
return info;
} public static void main(String[] args) { //模拟数据库中的一个用户名
String username="haha"; //加盐,salt 类型是ByteSource 解决不同用户名密码相同的问题。
ByteSource salt = ByteSource.Util.bytes("haha"); //算法的名称 和 原始密码 盐值
SimpleHash simpleHash = new SimpleHash("MD5","666" ,salt); //得到 加密后的数据 0668410aa0944d32908ca1fd66890c92
String s = simpleHash.toHex();
System.out.println(s); }
}

五,测试。

 
 

shiro 框架之 加密处理。的更多相关文章

  1. spring-mvc + shiro框架整合(sonne_game网站开发04)

    这篇文章讲的内容是在之前spring + mybatis + spring-mvc + freemarker框架整合的代码的基础上.有需要的可以看看我博客的前两篇文章. 另外,本文章所讲相关所有代码都 ...

  2. JAVAEE——BOS物流项目10:权限概述、常见的权限控制方式、apache shiro框架简介、基于shiro框架进行认证操作

    1 学习计划 1.演示权限demo 2.权限概述 n 认证 n 授权 3.常见的权限控制方式 n url拦截权限控制 n 方法注解权限控制 4.创建权限数据模型 n 权限表 n 角色表 n 用户表 n ...

  3. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十一):集成 Shiro 框架

    Apache Shiro 优势特点 它是一个功能强大.灵活的,优秀开源的安全框架. 它可以处理身份验证.授权.企业会话管理和加密. 它易于使用和理解,相比Spring Security入门门槛低. 主 ...

  4. Spring Boot + Spring Cloud 实现权限管理系统 (集成 Shiro 框架)

    Apache Shiro 优势特点 它是一个功能强大.灵活的,优秀开源的安全框架. 它可以处理身份验证.授权.企业会话管理和加密. 它易于使用和理解,相比Spring Security入门门槛低. 主 ...

  5. shiro框架的使用

    1.配置二级缓存 <ehcache updateCheck="false" name="shiroCache"> <defaultCache ...

  6. Shiro框架 (原理分析与简单实现)

    Shiro框架(原理分析与简单实现) 有兴趣的同学也可以阅读我之前分享的:Java权限管理(授权与认证)CRM权限管理   (PS : 这篇博客里面的实现方式没有使用框架,完全是手写的授权与认证,可以 ...

  7. 学习了解Shiro框架

    有关Shiro安全框架 实现权限的几种方式 1)通过表来实现 2)shiro框架 3)Spring Security框架 shiro有哪些主要功能 1.授权 访问控制的过程,即确定谁有权访问 2.身份 ...

  8. Shiro框架详解 tagline

    ​ 之间工作中曾经用到过shiro这个权限控制的框架,之前一直都是停留在用的方面,没有过多的 去理解这方面的知识,现在有时间,专门研究了一下这个Shiro权限的框架使用.   Shiro是什么?   ...

  9. 浅谈Shiro框架中的加密算法,以及校验

    在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码.为什么要加密:网络安全问题是一个很大的隐患,用户数据泄露事件层出不穷,比如12306账号泄露. Shiro提供了base64和1 ...

随机推荐

  1. 【LeetCode】486. Predict the Winner 解题报告(Python)

    [LeetCode]486. Predict the Winner 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: ht ...

  2. 1021 - Painful Bases

    1021 - Painful Bases   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB As ...

  3. Entropy Search for Information-Efficient Global Optimization

    目录 概 主要内容 的估计 的估计 Hennig P, Schuler C J. Entropy search for information-efficient global optimizatio ...

  4. 使用Xcode 制作自定义storyboard启动界面,供uniAPP使用。

    1新建项目 想要全屏显示并适应所有尺寸的iPad和iphone 需要用750*1624 2X 和 1125 * 2436 3X大小的图片 这里做完就可以导出文件了 把文件和图片放到一起 见下图 命名规 ...

  5. WinForm应用程序的开机自启、记住密码,自动登录的实现

    一.思路: 1.开机自启,自然是需要用到注册表,我们需要把程序添加到电脑的注册表中去 2.记住密码,自动登录,开机自启,在页面的呈现我们都使用复选框按钮来呈现 3.数据持久化,不能是数据库,可以是sq ...

  6. emqx启用redis认证插件

    本次测试使用的是免费版的 emqx-windows-4.3.10 版本 1.修改redis插件 emqx_auth_redis.conf  设置用户名密码,    auth.redis.passwor ...

  7. Ditto剪贴板增强工具

    1.简介 Ditto是一款强大的Windows剪贴板增强工具,它支持64位操作系统,而且完全免费,绿色开源,支持中文,而且还有免安装的绿色版本. 开启Ditto后,不会有任何程序界面出现,它只是默默地 ...

  8. 抛弃go-micro,使用极简微服务框架Bull

    简介 Bull是一款基于GO语言的极简微服务框架. 使用GRPC作为RPC协议,使用ETCD作为注册中心. 框架目前已经实现了服务注册.服务发现(客户端轮训)功能. 整体架构 代码地址 https:/ ...

  9. 使用 SSH 隧道实现端口转发、SOCKS 代理

    SSH隧道 本地端口转发 本地客户端通过 local_port 连接到 MobaXterm: MobaXterm 绕过防火墙,使用 user 用户连接到 ssh_server_ip:ssh_serve ...

  10. postgreSQL更改表的数据类型

    更改表的sql语句 ALTER table employees ALTER COLUMN status TYPE boolean USING status::boolean; 报下列错误 因为字段上设 ...