Spring之shiro使用教程

Shiro教程(一):入门概述与基本使用 Shiro入门概述与基本使用 阅读详情

Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。谈及shiro必然少不了一张图和三个关键词语:Subject, SecurityManager 和 Realms。
在这里插入图片描述
简单来说可以总结为:

Subject:用户提交的请求
SecurityManager:shiro核心代码
Realms:shrio沟通数据库和缓存的一个中间桥梁(分为三类:iniRealm、jdbcRealm、自定义Realm)

  1. 一个简单的shiro程序步骤
        // 指定认证的数据
		SimpleAccountRealm accountRealm = new SimpleAccountRealm();
		// 模拟添加用户
		accountRealm.addAccount("xingdo", "123456","admin","user");
		// 构建SecurityManager对象
		DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
		defaultSecurityManager.setRealm(accountRealm);
		// 4.主体提交认证请求
		SecurityUtils.setSecurityManager(defaultSecurityManager);// 构建SecurityManager环境
		Subject subject = SecurityUtils.getSubject();

		UsernamePasswordToken token = new UsernamePasswordToken("xingdo", "123456");
		subject.login(token);//模拟登录
		System.out.println("是否执行了认证"+subject.isAuthenticated());
		
        //subject.logout();//模拟退出
        //System.out.println("是否执行了认证"+subject.isAuthenticated());
		subject.checkRoles("admin","user");//验证角色权限

简单逻辑为:

  1. 指定认证的数据
  2. 模拟添加用户
  3. 构建SecurityManager对象
  4. 主体提交认证请求
  5. SecurityManager认证
  6. Authenticator认证
  7. Realm认证

上面说到Realm认证分为三种:iniRealm、jdbcRealm、自定义Realm,下面编写相关代码(由于jdbcRealm大同小异,不列出代码了就)
iniRealm代码

public class iniRealmTest {
	public static void main(String[] args) {
		
		IniRealm iniRealm = new IniRealm("classpath:shirotest/user.ini");
		// 1:构建SecurityManager对象,还有一个jdbcrealm不一一演示了
		DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
		defaultSecurityManager.setRealm(iniRealm);
		
		// 2.主体提交认证请求
		SecurityUtils.setSecurityManager(defaultSecurityManager);// 构建SecurityManager环境
		Subject subject = SecurityUtils.getSubject();

		UsernamePasswordToken token = new UsernamePasswordToken("xingdo", "123456");
		subject.login(token);// 模拟登录
		System.out.println("是否执行了认证" + subject.isAuthenticated());
		subject.checkRole("admin");
		subject.checkPermissions("user:delete","user:select1");

	}
}

在resources下新建文件夹shirotest,再新建文件user.ini,代码如下

[users]
xingdo:123456,admin
[roles]
admin=user:delete,user:update,user:insert,user:select1

简介:

  • 指定认证数据有一些改变,去user.ini下验证数据,本人路径为:shirotest/user.ini,不一样的可自行更改
  • 将待验证数据交由SecurityManager处理:defaultSecurityManager.setRealm(iniRealm);

自定义Realm

public class myRealm extends AuthorizingRealm {

	Map<String, String> userMap = new HashMap<String, String>();

	{
		userMap.put("xingdo", "a0bc2e2dd7e719d5713a4b8e54a274b7");
		super.setName("myRealm");
	}

	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		// 用来做授权
		String username = (String) principals.getPrimaryPrincipal();
		//从数据库中或者缓存中获取角色数据
		Set<String> roles = getRolesByUsername(username);
		SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
		authorizationInfo.setRoles(roles);
		
		return authorizationInfo;
	}

	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		// 用来做认证

		// 1,从主体传过来的认证信息中获取用户名,
		String username = (String) token.getPrincipal();

		// 2,通过用户名到数据库中获得密码
		String password = getpasswordByUsername(username);
		if (password == null) {
			return null;
		}
		SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo("xingdo", password, "myRealm");
		authenticationInfo.setCredentialsSalt(ByteSource.Util.bytes("xingdo"));//加盐的方法
		return authenticationInfo;
	}

	// 模拟数据库
	private String getpasswordByUsername(String username) {

		return userMap.get(username);
	}
	
	private Set<String> getRolesByUsername(String username){
		Set<String> roles = new HashSet<String>();
		roles.add("admin");
		roles.add("user");
		return roles;
		
	}

}

myRealm代码:

public class myRealmTest {
	public static void main(String[] args) {
		
		myRealm myRealm = new myRealm();
		
		// 构建SecurityManager对象,
		DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
		defaultSecurityManager.setRealm(myRealm);
		
		HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
		credentialsMatcher.setHashAlgorithmName("md5");//加密名称
		credentialsMatcher.setHashIterations(1);//加密次数
		myRealm.setCredentialsMatcher(credentialsMatcher);
		
		
		// 主体提交认证请求
		SecurityUtils.setSecurityManager(defaultSecurityManager);// 构建SecurityManager环境
		Subject subject = SecurityUtils.getSubject();

		UsernamePasswordToken token = new UsernamePasswordToken("xingdo", "123456");
		subject.login(token);// 模拟登录
		System.out.println("是否执行了认证" + subject.isAuthenticated());
		subject.checkRole("admin");
//		subject.checkPermissions("user:delete", "user:select1");
	}
}

整体逻辑:

  • 新建文件myRealm继承AuthorizingRealm并且实现doGetAuthorizationInfo方法和doGetAuthenticationInfo方法。其中doGetAuthorizationInfo用来做用来做授权,doGetAuthenticationInfo用来做认证。
  • 新建myRealmTest类,引用自定义的myRealm

doGetAuthorizationInfo、doGetAuthenticationInfo方法整体逻辑:

  1. 从主体传过来的认证信息中获取用户名,
  2. 从数据库中或者缓存中获取角色数据
  3. 构建SimpleAuthorizationInfo对象
  4. 将角色信息存放到SimpleAuthorizationInfo对象中并且返回信息

由于本次没有做mybatis集成,无法链接数据库,整体逻辑均使用的模拟数据库。将在下一篇文章中列出shiro与SpringBoot、mybatis的集成

至此整体shrio简单使用已经完成。现在互联网安全越来越重视,尤其是用户密码更是重中之重,那么shiro是怎么实现密码加密的呢?
shiro加密部分代码(该部分代码在myRealmTest中体现)

HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
credentialsMatcher.setHashAlgorithmName("md5");//加密名称
credentialsMatcher.setHashIterations(1);//加密次数
myRealm.setCredentialsMatcher(credentialsMatcher);

MD5虽然无法反向解密,但是由于现在是大数据时代,将一些常见的密码和对应的加密字符串存放起来,根据字符串可以查找出未加密密码;这种情况加shrio推出了一种加”盐“的概念。即:在md5的基础上,新增一个字符串,用新增加的字符串和md5规则去加密。代码实现如下

authenticationInfo.setCredentialsSalt(ByteSource.Util.bytes("xingdo"));//加盐的方法

以上代码在myRealmTest中体现,xingdo即新增的字符串

shiro简介及入门 文章目录shiro简介1. 什么是shiro2. 在应用程序角度来观察如何使用Shiro完成工作3. shiro架构Shiro入门案例Shiro与web容器的集成 shiro简介 1. 什么是shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权。 spring中有spring security (原名Acegi),是一个权限框架,它和spring依赖过... 阅读详情

相关推荐

Shiro 实战教程

Apache Shiro是一个强大且易用的Java安全框架,它执行身份验证、授权、密码和会话管理。根据实际需求,你还可以配置Shiro的其他功能,如会话管理、加密等。以上就是在Spring Boot项目中整合Shiro进行权限管理的实操过程。首先,在Spring Boot项目中引入Shiro的依赖。在上面的代码中,你需要根据实际需求从数据源(如数据库)中查找用户信息和权限信息。四、使用Shiro进行身份认证和授权。为你实际要使用的Shiro版本号。一、引入Shiro依赖。你的Shiro版本号。

IT深耕十余载,大道之简 1121

spring集成shiro详解

shiro说明 springboot集成shiro 前后端分离项目集成shiro shiro集成其他认证方式

u010752885的博客 7535

Shiro与Spring框架的Java开发实战教程

Apache Shiro是一个全面的Java/Java EE安全框架,提供身份验证、授权、会话管理以及加密等功能。它易于理解和使用,拥有易于维护的API,能够从轻量级的Web应用到大型企业应用中的集成。Shiro的架构基于三个核心概念:Subject、SecurityManager和Realms。其中,Subject代表当前与软件交互的用户;SecurityManager作为Shiro架构的核心,管理所有的Subject;而Realms扮演Shiro与安全数据源之间的桥梁角色,负责认证和授权。

weixin_42588672的博客 947

Springboot整合Shiro框架入门

Springboot整合Shiro框架入门 1、快速开始demo 2、Springboot集成Shiro 2.1、环境搭建 2.2、shiro的拦截 2.3、shiro的认证 2.4、整合mybatis 2.5、shiro进行授权 2.6、shiro整合thymeleaf 3、小结 1、快速开始demo 来到shiro的官网:shiro官方网站: 下载官方在git仓库上提供的源码,下载后解压: 官方提供了在多种场景下使用的demo,等一下会用到sample里面的东西。下面直接按官方推荐

web15285868498的博客 8317

Spring Boot与Apache Shiro的权限管理实战教程

在本章中,我们将简要介绍Spring Boot与Apache Shiro在企业级权限管理系统中的重要性,以及它们如何共同构建安全的Web应用程序。Spring Boot是一个开源框架,旨在简化Spring应用的创建和开发过程。它通过提供默认配置来减少项目搭建的复杂性,让开发者能够专注于业务逻辑本身。Spring Boot的自动配置特性极大地简化了项目搭建和运维的过程,使得开发团队能够快速启动和运行Spring应用程序。

weixin_35749545的博客 1060

解决VM 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VM 的方法

在启用了Credential Guard或Device Guard的Windows 10主机上启动12.5版之前的VMware Workstation中的虚拟机时,将显示蓝色诊断屏幕(BSOD)。 会看到类似于以下内容的错误: VMware Workstation和Device / Credential Guard不兼容。禁用Device / Credential Guard后,可以运行VMwar...

Hern(宋兆恒) 39万+

Spring Boot 整合 Apache Shiro 教程

Spring Boot 整合 Apache Shiro 教程 1. 项目介绍 spring-boot-shiro 是一个开源项目,旨在将 Apache Shiro 安全框架与 Spring Boot 进行集成。Apache Shiro 是一个强大且灵活的 Java 安全框架,用于身份验证、授权、会话管理和加密。通过将 Shiro 与 Spring Boot 结合,开发者可以更方便地在 Spring...

gitblog_00661的博客 449

扩散模型在工业缺陷检测中的应用与优化

扩散模型作为生成式AI的重要分支,通过逐步去噪的逆向过程实现高质量数据生成。其核心U-Net架构结合残差连接和时间步嵌入,特别适合处理工业场景中的细微缺陷检测。在计算机视觉领域,这种技术突破了传统深度学习模型对小样本数据的限制,通过域自适应预训练和小样本微调两阶段框架,显著提升金属表面、纺织品等复杂场景的检测准确率。关键技术实现涉及噪声调度优化、多任务损失设计等工程实践,最终在MVTec AD等工业数据集上达到90%以上的检测精度,为智能制造提供可靠的自动化质检方案。

weixin_30512043的博客 497

Spring Boot整合Shiro教程

Spring Boot整合Shiro教程 项目介绍 本项目是一个基于Spring Boot和Apache Shiro的安全框架整合示例。Apache Shiro是一个强大且灵活的开源安全框架,用于身份认证、授权、会话管理和加密。Spring Boot则是一个用于简化Spring应用初始搭建以及开发过程的框架。通过将两者结合,可以快速构建一个具备安全认证和授权功能的企业级应用。 项目快速启动 1. ...

gitblog_00326的博客 958

多机器人协同:水下机器人集群的分布式控制与ROS仿真实践

本文探讨了多自主水下机器人(AUV)集群的分布式控制方法,重点分析了欠驱动6自由度AUV模型的反馈线性化技术。通过ROS/Gazebo仿真平台,详细介绍了系统架构设计、通信延迟补偿策略及环境扰动应对方案,为水下协同作业提供实用参考。

jupi8的博客 687

Altium Designer操作技巧(1)——原理图中如何批量替换元器件?

《AltiumDesigner批量替换元器件技巧分享》摘要:本文介绍了两种在AltiumDesigner中批量替换元器件的实用方法。方法一通过“查找相似对象”功能,可精准匹配并批量修改器件参数;方法二利用ActiveBOM功能,在BOM表中直观操作器件替换,推荐使用第二种方法可使BOM管理更高效。这些技巧能有效减少物料种类、降低贴装成本,特别适用于电阻电容等常用器件的批量替换。关注公众号获取更多电子设计技巧。

u012526819的博客 2578

Spring Boot + Shiro 整合实战教程

Spring Boot + Shiro 整合实战教程 1. 项目目录结构及介绍 本教程基于从GitHub获取的开源项目 springboot-shiro,该项目展示了如何在Spring Boot应用程序中集成Apache Shiro来实现用户认证与授权。以下是项目的基本目录结构及其简介: springboot-shiro ├── src │ ├── main │ │ ├── java ...

gitblog_00500的博客 787

Qt 5.12.8在Linux下编译qtvirtualkeyboard模块,我踩过的那些坑(附完整解决方案)

本文详细介绍了在Linux系统下为Qt 5.12.8单独编译qtvirtualkeyboard模块的完整解决方案。通过分析模块缺失原因、提供精准的编译步骤和常见问题处理,帮助开发者高效解决虚拟键盘模块缺失问题,避免重新编译整个Qt源码的繁琐过程。

weixin_29248611的博客 458

jsets-shiro-spring-boot-starter 使用教程

jsets-shiro-spring-boot-starter 使用教程 项目介绍 jsets-shiro-spring-boot-starter 是一个用于在 Spring Boot 项目中集成 Apache Shiro 权限管理框架的 Starter 项目。该项目旨在简化 Shiro 在 Spring Boot 中的配置和使用,提供开箱即用的体验。它封装了常用的功能,如验证码、密码错误次数限制...

gitblog_00710的博客 597

技术面 - 手撕算法题整理

这篇博客整理了华为OD面试中涉及的算法题,包括LeetCode热门题目、OD原题和需要手写的算法,如二分查找、冒泡排序等。建议优先刷"hot100"的LeetCode题目,全刷OD原题,以及掌握手撕算法的基本原理。

m0_73659489的博客 1024

LangGraph-StateGraph 和 Graph API 源码分析

摘要: StateGraph是LangGraph的核心API,用于构建有状态工作流图。本文分析了其实现原理,包括: 核心类关系:StateGraph(构建器)和CompiledStateGraph(继承自Pregel的可执行图) 关键流程:状态模式到通道的映射、节点到PregelNode的转换 实现特点: 支持TypedDict和Pydantic两种状态模式 自动选择通道类型(LastValue或BinaryOperatorAggregate) 通过映射函数处理节点输入输出 边实现基于通道写入机制 编译过程

838

Shiro + JWT + Spring Boot Restful 简易教程

这份文档从构建一个键值数据库的关键架构入手,不仅带你建立起全局观,还帮你迅速抓住核心主线。除此之外,还会具体讲解数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的Redis使用者都是一份非常完美的教程了。你的支持,我的动力;祝各位前程似锦,offer不断!!!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_83817769的博客 1114

【系统移植】 移植主线U-Boot(v2024.01-rc3)到RK3399

[系统移植] 移植主线U-Boot(v2024.01-rc3)到RK3399

Systemcall名屋 1003

Spring-Shiro-Spark 项目教程

Spring-Shiro-Spark 项目教程 1. 项目的目录结构及介绍 Spring-Shiro-Spark/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ ├── com/ │ │ │ │ ├── example/ │ │ │ │ │ ├── controller/ # 控制器类 │ │ ...

gitblog_00254的博客 395

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Shiro 入门教程 - Shiro Spring 集成

作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!

smart_an的专栏 866

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Spring Shiro使用教程

使用Shiro的时候我们要考虑在什么样的环境下使用:     1.登录的验证  2.对指定角色的验证  3.对URL的验证 基于这三个需求,我们有三个方法: 1. findUserByUserName(String username)根据username查询用户,之后Shiro会根据查询出来的User的密码来和提交上来的密码进行比对。  2. findRoles(String

especialjie的博客 680

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【亲测免费】 Spring Boot 集成 Shiro 和 CAS 单点登录教程

Spring Boot 集成 Shiro 和 CAS 单点登录教程 1. 项目介绍 本项目是一个基于 Spring Boot 的集成 Shiro 和 CAS 单点登录的示例应用。Shiro 是一个强大且易用的 Java 安全框架,用于执行身份验证、授权、密码学和会话管理。CAS(Central Authentication Service)是一个单点登录协议,允许用户在一次登录后访问多个相互关联的...

gitblog_00400的博客 1168

spring boot 、mybatis-plus、shiro整合入门教程(三)——shiro使用

接续上一篇,spring boot 、mybatis-plus、shiro整合入门教程(二)——mybatis-plus常用操作 这篇主要介绍下shiro在项目中是如何使用的, 前期的主要工作是数据库表的设计,上篇文章已经给出表的设计,详细的数据库初始化sql,可以参考代码库的sql, 简单说下登录原理,用户每次登录的时候生成token,同时根据用户id更新数据库中的token有效时间和toke...

u011915230的专栏 1302

Spring Boot 集成 Shiro 和 CAS 项目教程

Spring Boot 集成 Shiro 和 CAS 项目教程 1. 项目目录结构及介绍 springboot-cas-shiro ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── example │ │ │ ├── config │ │ │ ...

gitblog_00789的博客 582

Spring Security及Shiro整合JWT 网上教程的一些坑!

Spring Security及Shiro整合JWT 网上教程的一些坑!

Candour_0的博客 342

Shiro + JWT + Spring Boot Restful 简易教程,头条三面技术四面HR

org.inlighting shiro-study 1.0-SNAPSHOT org.apache.shiro shiro-spring 1.3.2 com.auth0 java-jwt 3.2.0 org.springframework.boot spring-boot-starter-web 1.5.8.RELEASE org.springframework.boot spring-boot-maven-plugin 1.5.7.RELEASE repackage

m0_54861402的博客 240
上一篇: @GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping、@RequestMapping详解
下一篇: CentOS下安装mysql,实现远程链接及其常见问题解决方案
只会debug
博客等级 码龄9年 69粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值