Shiro中的加密和验证策略

Shiro框架详解 Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存等。记住一点,Shiro 不会去维护用户、维护权限;这些需要我们自己去设计 / 提供;然后通过相应的接口注入给 Shiro 即可。 阅读详情

上篇中我们说了Shiro的框架的认证,这篇我们来说说Shiro框架的加密和验证策略

Shiro的加密有很多,现在常用的就MD5(消息摘要),要想给传入密码加密要在Spring的

applicationContext配置

<?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">

   <!--配置securityManager的bean-->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <!--配置Shiro缓存 -->
        <property name="cacheManager" ref="cacheManager"/>
       
        <!--配置realm(这个非常的重要)-->
        <property name="realm" ref="jdbcRealm"/>
      
    </bean>
    

    <!--配置缓存-->
    <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/>
    </bean>
    <!--配置Realm-->
    <bean id="jdbcRealm" class="org.peter.realm.MyRealm">
        <!--配置密码加密-->
        <property name="credentialsMatcher">
            <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
                <property name="hashAlgorithmName" value="MD5"/>
                <property name="hashIterations" value="1024"/>
            </bean>
        </property>
    </bean>
    
    <!--配置Spring去管理Shiro中的bean的生命周期-->
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

    <!--开启Shiro的注解使用-->
    <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>

    <!--配置页面过滤规则-->
    <!--web.xml中filter-name的名字要和ShiroFilterFactoryBean的id一样,不一样会出错-->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"/>
        <!--配置登录页面-->
        <property name="loginUrl" value="/Login.jsp"/>
        <!--配置登录成功后的页面-->
        <property name="successUrl" value="/index.jsp"/>
        <!--配置没有获得访问权限的页面-->
        <property name="unauthorizedUrl" value="/s/unauthorized"/>

        <property name="filterChainDefinitions">
            <value>
                <!--anon 表示Login.jsp可以匿名访问-->
                /Login.jsp = anon
                /login=anon
                <!--配置退出-->
                /logout=logout
                <!--authc表示剩余的页面必须在登录后访问-->
                /** = authc
            </value>
        </property>
    </bean>
</beans>
第二步:在配置完Spring之后,在配置MyRealm文件

package org.peter.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;

/**
 * Created by Lenovo on 2017/8/1.
 */
public class MyRealm extends AuthenticatingRealm {
    @Override
    public String getName() {
        return "MyRealm";
    }

    @Override
    public boolean supports(AuthenticationToken token) {
        return token instanceof UsernamePasswordToken;
    }

    // MD5消息摘要(密码加密)
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token1) throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) token1;
        /*获取到用户名*/
        String username = token.getUsername();
        if ("zs".equals(username)){
            throw new UnknownAccountException("用户名不存在");
        }
        if ("ls".equals(username)){
            throw new LockedAccountException("该用户已经被锁");
        }
        // 取数据库中在查询
        // ....................
        Object credentials = null;
        if ("admin".equals(username)){
            credentials="c41d7c66e1b8404545aa3a0ece2006ac";
        }else if("wangwu".equals(username)){
            credentials="b6f8daff78cfcb486454e6914e666c71";
        }

        ByteSource credentialsSalt = ByteSource.Util.bytes(username);
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, credentials,credentialsSalt, getName());
        return info;
    }

    public static void main(String[] args) {
//      解密:
        ByteSource salt = ByteSource.Util.bytes("wangwu");
        SimpleHash simpleHash = new SimpleHash("MD5","123",salt,1024);
        System.out.println(simpleHash);
    }
}
这样就可以实现密码加密

Shiro的验证策略

shiro的验证策略:

1.AuthenticationStrategy接口的默认实现:

2.FirstSuccessfulStrategy:只要有一个Realm 验证成功即可,只返回第一个Realm 身份验证成功的认证信息,其他的忽略;

3.AtLeastOneSuccessfulStrategy:只要有一个Realm验证成功即可,和FirstSuccessfulStrategy不同,将返回所有Realm身份验证成功的认证信息;

4.AllSuccessfulStrategy:所有Realm验证成功才算成功,且返回所有Realm身份验证成功的认证信息,如果有一个失败就失败了。

5.ModularRealmAuthenticator默认是AtLeastOneSuccessfulStrategy策略

为了验证修改策略的影响,我们创建了两个Realm文件

实现策略的修改,我们只需要修改Spring的applicationContext.xml的配置

<?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">

   <!--配置securityManager的bean-->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <!--配置Shiro缓存 -->
        <property name="cacheManager" ref="cacheManager"/>
        <!--调用配置策略的时候要放在realms前面-->
        <property name="authenticator" ref="authenticator"/>

        <!--配置realm(这个非常的重要)-->
        <!--<property name="realm" ref="jdbcRealm"/>-->
        <!--配置多个realms执行的顺序就是从上到下-->
        <property name="realms">
            <list>
                <ref bean="jdbcRealm"/>
                <ref bean="SecondRealm"/>
            </list>
        </property>
    </bean>
    <!--认证策略有三种:
    第一种:只要有一个认证成功就算成功
    第二种:只要第一个认证成功就算成功
    第三种:全部认证成功,才算成功
    -->
    <!--修改认证策略-->
    <bean class="org.apache.shiro.authc.pam.ModularRealmAuthenticator" id="authenticator">
        <property name="authenticationStrategy">
            <bean class="org.apache.shiro.authc.pam.AllSuccessfulStrategy"/>
        </property>
    </bean>

    <!--配置缓存-->
    <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/>
    </bean>
    <!--配置Realm-->
    <bean id="jdbcRealm" class="org.peter.realm.MyRealm">
        <!--配置密码加密-->
        <property name="credentialsMatcher">
            <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
                <property name="hashAlgorithmName" value="MD5"/>
                <property name="hashIterations" value="1024"/>
            </bean>
        </property>
    </bean>
    <bean id="SecondRealm" class="org.peter.realm.SecondRealm">
        <!--配置密码加密-->
        <property name="credentialsMatcher">
            <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
                <property name="hashAlgorithmName" value="sha1"/>
                <property name="hashIterations" value="1024"/>
            </bean>
        </property>
    </bean>
    <!--配置Spring去管理Shiro中的bean的生命周期-->
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

    <!--开启Shiro的注解使用-->
    <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>

    <!--配置页面过滤规则-->
    <!--web.xml中filter-name的名字要和ShiroFilterFactoryBean的id一样,不一样会出错-->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"/>
        <!--配置登录页面-->
        <property name="loginUrl" value="/Login.jsp"/>
        <!--配置登录成功后的页面-->
        <property name="successUrl" value="/index.jsp"/>
        <!--配置没有获得访问权限的页面-->
        <property name="unauthorizedUrl" value="/s/unauthorized"/>

        <property name="filterChainDefinitions">
            <value>
                <!--anon 表示Login.jsp可以匿名访问-->
                /Login.jsp = anon
                /login=anon
                <!--配置退出-->
                /logout=logout
                <!--authc表示剩余的页面必须在登录后访问-->
                /** = authc
            </value>
        </property>
    </bean>
</beans>
这样就可以修改认证的策略


shiro登陆身份认证和权限管理 密码加密 shiro登陆,shiro登陆身份认证和权限管理 密码加密。自己写的demo。实用。希望大家多多支持。谢谢大家 立即下载

相关推荐

Halcon Socket TCP通讯:从算子调用到工业视觉系统集成

本文详细介绍了Halcon Socket TCP通讯在工业视觉系统中的应用与优化技巧。从基础算子调用到高并发处理,再到与PLC、机器人及MES系统的集成实战,提供了全面的解决方案和性能优化建议,帮助开发者高效实现工业视觉系统的通讯需求。

weixin_33502772的博客 248

shiro加密 加盐 以及登录验证

2.用户注册时对密码进行加盐加密 盐生成方式:通常用用户id+随机数产生(这里直接使用随机数) 加密方法:使用shiro自带的Md5Hash 参数分别为:密码 盐值 加密次数(注意这里加密次数与配置类中加密次数必须一致) 将加密后的密码和盐值存放在数据库中这里的密码对比是通过 密码+盐值对比数据库中的密码 具体方法参数如图 到此 结束---------------------------------------------------------------------------------------

zhangaiav的博客 622

电赛备赛笔记:用STM32驱动AD9959信号发生器模块,从接线到出波保姆级教程

本文详细介绍了如何使用STM32驱动AD9959信号发生器模块,从硬件接线到软件调试的全流程。AD9959作为高性能DDS芯片,适用于电子设计竞赛中的信号生成需求。文章包含硬件连接指南、寄存器配置解析、多通道控制技巧以及常见问题解决方案,帮助参赛者快速掌握AD9959的应用。

weixin_31858171的博客 366

shiro实现密码加密验证的方法及原理

基础的配置不再赘述,仅说明密码加密校验需要增加的配置 1、配置ShiroConfig @Bean public HashedCredentialsMatcher hashedCredentialsMatcher(){ HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(); //设置加密算法 hashedCredentialsMatc

lucky_shanshan的博客 2829

Alibaba Java Coding Guidelines,以后我的Java代码规范,就靠它了

前言 对于Java代码规范,业界有统一的标准,不少公司对此都有一定的要求。但是即便如此,庞大的Java使用者由于经验很水平的限制,未必有规范编码的意识,而且即便经验丰富的老Java 程序员也无法做到时刻将规范牢记于心。所以对于代码规范扫描工具,一经问世就广受青睐,阿里巴巴出品的Alibaba Java Coding Guidelines(阿里巴巴Java代码规约扫描,以下简称为AJCG)插件便是其...

java梦工厂 859

Isaac Lab强化学习实战:用SO-ARM101机械臂实现抓取任务(附B站视频教程)

本文详细介绍了如何使用Isaac Lab强化学习框架,在SO-ARM101机械臂上实现抓取任务的完整实战流程。内容涵盖从环境搭建、奖励函数设计、训练调参到模型部署的各个环节,并分享了Sim-to-Real迁移的关键技巧,旨在帮助开发者高效完成机器人强化学习项目。

weixin_29070721的博客 1101

shiro简单的密码加盐与登录验证

一、pom.xml配置 首先导入依赖,从guns项目的pom.xml中拽出并把版本号替换成1.3.2 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.3.2</versi...

wogoshu1的博客 2667

OpenMV识别颜色源码

【代码】OpenMV识别颜色源码。

dxt258013的博客 402

使用 Shiro 的 SimpleHash 加密密码工具类的方法详解

在应用程序中,保护用户密码的安全是非常重要的。Shiro 是一个强大的安全框架,提供了多种加密算法来保护用户密码。本文将介绍如何使用 Shiro 的 SimpleHash 加密密码工具类,帮助你实现密码的安全存储和验证。通过本文的介绍,你学习了如何使用 Shiro 的 SimpleHash 加密密码工具类来实现密码的安全存储和验证。你了解了创建密码加密工具类的方法,并使用 Shiro 提供的加密算法、明文密码、盐和迭代次数进行密码加密。

pleaseprintf的博客 1021

【保姆级教程/代码】GNSS反演大气可降水量(Precipitable Water Vapor, PWV)

GPS精密单点定位(PPP)是一种采用精密卫星星历和卫星钟差进行非差单点定位的方法,在观测过程中采用双频载波相位观测法以确保高精度定位精度。本文利用PPP技术来求解天顶对流层延迟(zenith tropospheric delay,ZTD)。ZTD由湿延迟(ZWD)和干延迟(ZHD)组成,其中占比90%的ZHD与地面测站高程、大气压和测站纬度等参数有良好的相关性,可以通过Saastamoinen模型精确求出;

weixin_43910227的博客 2923

Howland电流源电路:从理论到实践的深度解析与优化策略

本文深度解析了Howland电流源电路的工作原理,从经典四电阻架构的“虚短”“虚断”分析,到其实现宽带恒流输出的理论优势。重点剖析了实践中因电阻精度、运放参数及PCB布局导致的性能瓶颈,并提供了引入第五电阻、优化运放选型等关键优化策略,旨在将输出阻抗从kΩ级提升至MΩ级,以满足精密测量与传感器驱动等应用需求。

weixin_29243063的博客 441

shiro会话管理和加密

Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如Tomcat),不管是J2SE还是J2EE环境都可以使用,提供了会话管理,会话事件监听,会话存储/持久化,容器无关的集群,失效/过期支持,对 Web 的透明支持,SSO 单点登录的支持等特性。如果你需要保存密码(比如网站用户的密码),你要考虑如何保护这些密码数据,像下面那样直接将密码写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码,比如之前的600w 优快云账号泄露对用户可能造成很大损失。提供 CRUD 操作。

hhgh_的博客 1223

基于Simulink进行步进电机的重复控制仿真建模

目的:通过引入一个周期延迟环节来补偿系统的周期性误差,从而提高系统对周期性参考信号或扰动的跟踪性能。方法内部模型原理:在控制器中嵌入一个与周期性信号相关的模型(例如周期延迟环节),以实现对周期性误差的零稳态误差控制。滤波器设计:为了避免高频噪声放大,通常会在重复控制器中加入低通滤波器。优势对周期性信号具有良好的跟踪性能。不需要精确的数学模型即可实现高性能控制。挑战:需要合理设计重复控制器的参数以避免系统不稳定。

MHD0815的博客 382

Shiro笔记二:密码的MD5加密、密码的MD5盐值加密、Shiro多 Realm 验证、Shiro认证策略、把 realms 配置给 SecurityManager

二、加密   11. Shiro_密码的MD5加密 1.如何将一个字符串加密为MD5   2.实现将前台传递过来的密码加密,替换当前Realm的credentialsMatcher属性, 直接使用HashCredentialsMatcher对象,并设置加密算法即可。   &lt;!--    3. 配置 Realm    3.1 直接配置实现了 org.apache.shiro.re...

Welcome 1943

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Shiro验证策略-shiro自定义实现Realm来实现身份验证-shiro散列加密算法-shiro授权-shiro自定义Realm实现授权

Shiro验证策略 Authentication Strategy:认证策略,在shiro中有三种认证策略; AtleastOneSuccessfulStrategy【默认】 如果一个或多个Realm验证成功,则整体的尝试被认为是成功的。如果没有一个验证成功,则整体尝试失败; FirstSuccessfulStrategy 只有第一个成功地验证的Realm返回的信息将被使用。所有进一步的Realm将被忽略。如果没有一个验证成功,则整

pshdhx的博客 4402

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

shiro框架

1.shiro简介 1.1.基本功能点 Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在 JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存等。 · Authentication:身份认证 / 登录,验证用户是不是拥有相应的身份;· Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对..

Mr_Jin的博客 4481

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Shiro框架总结】3. 认证

目录 1. 身份认证流程 2. 具体实现 3. 加密、盐值加密 4. 多realm的实现、策略 一、身份认证 1. 身份验证 身份验证:一般需要提供如身份 ID 等一些标识信息来表明登录者的身份,如提供 email,用户名/密码来证明。 在 shiro 中,用户需要提供 principals (身份)和 credentials(证明)给 shiro,从而应用能验证用户身份。 ...

FullStackDeveloper0的博客 378

【Shiro】Shiro登录验证失败问题

shiro登录验证一直失败: 原因: 在用户注册时,采用如下加密方法: /** * md5加密工具 * @param var * 要加密的字符串 * @param iterations * 加密次数 * @return */ public static String encrypt(String var,int iterations){ return new SimpleHash("md5",var,SALT.getBytes(),iterations).toHex(); } 在Sh

m0_67392182的博客 1074

Shiro第五章-编码、加密

密码存储应加密或生成摘要存储。 编码、解码 Shiro提供了base64和16进制对字符串进行编码、解码。其内部的一些数据的存储和表示也都使用了base64和16进制的字符串。 base64:网络上最常用的用于传输8bit字节码的编码方式之一,可用于在HTTP环境下传递较长的标识信息,起到简单的加密作用。主要是基于64个可打印字符来表示二进制数据,即编码过程是从二进制...

海恩的博客 508

Shiro身份验证

Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存等。 在 shiro 中,用户需要提供 principals (身份-用户名)和 credentials(证明-密码)给 shiro,从而应用能验证用户身份。 UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123"); try { subject.login(token); } catch (AuthenticationException

fhxyryxc的博客 190

Shiro 安全框架入门知识

Shiro 简介 照例又去官网扒了扒介绍: Apache Shiro™is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-...

蔡定努 1528

shiro中的验证用户身份认证以及授权

Shiro从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。 最基础的是Realm接口,CachingRealm负责缓存处理,AuthenticationRealm负责认证,AuthorizingRealm负责授权。 通常自定义的realm继承Authoriz

m0_62019369的博客 3930

全注解 springboot 集成 shiro 盐值加密

记录一下自己集成shiro的步骤,也是第一次使用,很多地方比较生硬 1.导入pom包 &amp;amp;lt;!-- shiro --&amp;amp;gt; &amp;amp;lt;dependency&amp;amp;gt; &amp;amp;lt;groupId&amp;amp;gt;org.apache.shiro&amp;amp;lt;/groupId&amp;amp;gt;

qq_26412535的博客 882

Shiro自定义加密、授权、缓存、session管理和退出

一、总结与计划 1.1 总结 SpringBoot整合Shiro完成权限管理 Shiro功能 认证 授权 SpringBoot项目部署 jar包 nohup java -jar *.jar layui使用 1.2 计划 shiro 加密(认证) 授权 过滤器 注解 java代码 ..

u014748504的博客 674

shiro的使用2 灵活使用shiro的密码服务模块

    shiro最闪亮的四大特征是认证,授权,加密,会话管理。 上一篇已经演示了如何使用shiro的授权模块,有了shiro这个利器,可以以统一的编码方式对用户的登入,登出,认证进行管理,相当的优雅。 为了提高应用系统的安全性,这里主要关注shiro提供的密码服务模块; 1,加密工具类的熟悉   首先来个结构图,看看shiro哥哥提供了哪些加密工具类:     ...

游戏发行平台,跨境电商,低代码,物联网,数字人商业项目架构师 153
上一篇: Shiro实现认证
下一篇: Shiro授权
@夫子慧
博客等级 码龄9年 9粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值