JWT转换器 前面的例子中,都是在授权服务配置类中配置了一个很简单的jwt转换器,如下: 可以看到我们只用setSigningKey方法配置了一个秘钥,这里使用的是简单的对称加密的方式来加密jwt内容,同时资源服务器中使用的也是同样的秘钥配置jwt转换器: 除了对称加密的方式,生产环境使用非常多的是更加安全的非对称加密的方式来加密jwt. 生成公私钥 公私钥对可以使用jdk的命令 keytool 来生成,首先来看一下这个命令下有哪些参数: 中文的参数说明很清晰,我们需要使用 -genkeypai…
OAuth2.0 OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者.客户端来申请资源,资源所有者同意以后,资源服务器可以向客户端颁发令牌.客户端通过令牌,去请求数据.也就是说,OAuth 的核心就是向第三方应用颁发令牌.而且,OAuth 2.0 规定了四种获得令牌的流程.你可以选择最适合自己的那一种,向第三方应用颁发令牌. 具体的OAuth学习建议仔细研读阮一峰的教程, http://www.ruanyifeng.com/blog/2019/04/oauth_design…
登录总结 前面基本介绍了security的常规用法,同时介绍了JWT和它的一个简单实现,基本上开发中遇到的登录问题都能解决了,即使在分布式开发,或者微服务开发中实现登录也基本没有问题了.security本身已经实现的比较完善的安全处理,加上JWT的验证方式,可以实现一个理想的登录功能. 我们来看登录,给用户一个账号,验证有效后登录成功,这一步是任何系统都无法避免的.无论这个账号只能登录一个系统还是像支付宝账号一样登录多个app,无论账号是用户名密码,还是手机验证码,或者邮箱等其他形式,可以说认证…
示例代码的改进 前面使用spring cloud security和spring cloud oauth2写了一个第三方授权的例子,例子非常的简单,主要目的是用来熟悉OAuth2.0 申请授权的整个流程,这个简单的示例肯定是不能直接用于生产环境的,还有很多需要改进的地方,我们来总结一下: 1.只演示了授权码的形式,其它的三种(隐藏式,密码式,客户端凭证)并没有熟悉 2.密码和秘钥是未加密的 3.oauth的客户端配置,包括id,秘钥等信息是在内存中配置死的,无法动态增加 4.token也是放在内…
自动批准授权码 前面我们授权的流程中,第一步获取授权码的时候,都会经历一个授权是否同意页面: 这个流程就像第三方登录成功后,提问是否允许获取昵称和头像信息的页面一样,这个过程其实是可以自动同意的,需要在客户端配置中,增加一个自动批准: 这样我们申请授权码直接就可以得到: 在流程需要自动完成的时候,需要这样配置,如果需要用户点击同意,那么这里需要设置为false,不写默认也是false. 客户端信息整理 上面的自动批准只是客户端配置中一个小的配置,下面我们来系统整理一下客户端所有可配置的内容.首先…
内存中存储token 我们来继续授权服务代码的下一个优化.现在授权服务中,token的存储是存储在内存中的,我们使用的是 InMemoryTokenStore : 图中的tokenStore方法支持很多种令牌的存储方式,来看一下: InMemoryTokenStore:这个版本的实现是被默认采用的,它可以完美的工作在单服务器上(即访问并发量压力不大的情况下,并且它在失败的时候不会进行备份),大多数的项目都可以使用这个版本的实现来进行尝试,你可以在开发的时候使用它来进行管理,因为不会被保存到磁盘中…
密码模式 前面介绍了授权码模式和刷新令牌两种获取最新令牌的方法,下面来看一下其它模式.首先看密码模式,我们默认配置的三种模式中其实就包含密码模式的支持: 因此我们启动项目,直接使用密码模式即可,访问地址是: http://ip:port/oauth/token 参数有五个,分别是: grant_type:密码模式值必须为 password username:用户名 password:密码 client_id:客户端id client_secret:客户端秘钥 访问示例如下: 密码模式适用于用户高…
使用Mybatis查询客户端信息 前面的例子使用了默认的jdbc配置来动态从数据库查询客户端信息,下面来改用更加灵活的mybatis来实现,改用mybatis,首先pom中换成mybatis的依赖: 然后新建一个实体类,并实现查询需要的 ClientDetails 接口: 由于接口默认需要实现的方法有很多返回类型为集合类型的,所以这里的部分get方法做一些调整,例如: 其它的可以自行下载源代码查看.实体类建好以后,我们就可以查询客户端了: 实现 ClientDetailsService 接口 查…
刷新token 前面的例子和配置都是从头开始申请授权码和令牌,现在来看一下如何根据获取令牌时,回参中的 refresh_token 来刷新令牌.现在在项目中配置的是内存模式的默认用户名密码,第一步先改成数据库查询的方式,具体过程参考前面的文章即可,来看security配置类: 然后修改授权服务配置类,在 endpoints 中配置userDetailsService: 修改成数据库方式也是为了创建userDetailsService对象,刷新令牌时会根据此对象对用户信息进行检查.这样刷新令牌的配…
使用JDBC维护授权码 前面的代码中,测试流程第一步都是获取授权码,然后再携带授权码去申请令牌,授权码示例如下: 产生的授权码默认是 6 位的,产生以后并没有做任何管理,可以说是一个临时性的授权码,oauth2也提供了将授权码使用jdbc进行管理的功能,首先在数据库中创建表 oauth_code : code:存储服务端系统生成的code的值(未加密) authentication:存储将AuthorizationRequestHolder.java对象序列化后的二进制数据. 然后创建bean…
应用登记 一个应用要求 OAuth 授权,必须先到对方网站登记,让对方知道是谁在请求.举个例子,下面是github的登记页面: https://github.com/settings/applications/new 下面我们来自己做一个简单的应用登记,根据表 oauth_client_details 的结构,我们登记的时候只填写应用名称和回调地址即可,其它的字段如下: client_id:使用UUID生成 client_secret:使用UUID生成,并使用 BCryptPasswordEnc…
增加Eureka 前面介绍的项目都是授权服务和资源服务单独两个,这样在资源服务中的 check_token 地址都是写死的地址 : 下面我们把eureka加上,这样就可以直接用服务名了.eureka服务的搭建不再讨论,在服务中加eureka只需要改两个地方,就是加依赖和修改配置: 增加配置如下: 然后就可以把资源服务中的固定ip改为服务名: 增加令牌中继 从授权服务获取令牌以后,直接访问一个资源服务是没有问题的,但是如果资源服务又去调用其它资源服务,就会产生一个问题,就是令牌无法自动往下传递.要…
Jeecg-Boot前后端分离版http://www.jeecg.org/forum.php?gid=229 Jeecg-Boot 快速开发平台http://boot.jeecg.org/user/login?redirect=%2F JEECG官方网站-JAVA快速开发平台http://www.jeecg.org/forum.php?mod=viewthread&tid=7828&extra=page%3D1 JEECG官方网站-JAVA快速开发平台http://www.jeecg.or…
代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + AOP界面编程初探>咱们说到了依赖注入Autofac的使用,不知道大家对IoC的使用是怎样的感觉,我个人表示还是比较可行的,至少不用自己再关心一个个复杂的实例化服务对象了,直接通过接口就满足需求,当然还有其他的一些功能,我还没有说到,抛砖引玉嘛,大家如果有好的想法,欢迎留言,也可以来群里,大家一起学习讨…
本文梯子 本文3.0版本文章 代码已上传Github+Gitee,文末有地址 大神反馈: 零.今天完成的深红色部分 一.AOP 之 实现日志记录(服务层) 1.定义服务接口与实现类 2.在API层中添加对该接口引用 3.添加AOP拦截器 4.添加到Autofac容器中,实现注入 5.运行项目,查看效果 二.AOP 之 实现接口数据的缓存功能 1.定义 Memory 缓存类和接口 2.定义一个缓存拦截器 3.注入缓存拦截器 4.运行,查看效果 5.多个AOP执行顺序问题 6.无接口如何实现AOP…
前言 如果想直接在域名的根目录直接加载 swagger 比如访问:localhost:8001 就能访问,可以这样设置: app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "ApiHelp V1"); c.RoutePrefix = "";//路径配置,设置为空,表示直接访问该文件, //路径配置,设置为空,表示直接在根域名(localhost:800…
更新 1.在使用的时候,特别是更新数据的时候,如果不知道哪里有问题,可以查看数据库 和 实体类 的字段,是否大小写一致,比如 name 和 Name 2.在使用Sqlsugar 的 CodeFirst的时候,记得要先重建一个空的数据库,不然会提示错误. 3.要学会使用数据库监控分析器 代码已上传Github+Gitee,文末有地址 书接上文:<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之六 || API项目整体搭建 6.1 仓储>,…
代码已上传Github+Gitee,文末有地址 书说上文<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存>,昨天咱们说到了AOP面向切面编程,简单的举出了两个栗子,不知道大家有什么想法呢,不知道是否与传统的缓存的使用有做对比了么? 传统的缓存是在Controller中,将获取到的数据手动处理,然后当另一个controller中又使用的时候,还是Get,Set相关操作,当…
更新反馈 1.博友@落幕残情童鞋说到了,Nginx反向代理实现跨域,因为我目前还没有使用到,给忽略了,这次记录下,为下次补充.此坑已填 2.提示:跨域的姊妹篇——<三十三║ ⅖ 种方法实现完美跨域> 代码已上传Github+Gitee,文末有地址 今天忙着给小伙伴们提出的问题解答,时间上没把握好,都快下班了,赶紧发布:书说上文<从壹开始前后端分离[ .NET Core2.0 +Vue2.0 ]框架之十一 || AOP自定义筛选,Redis入门 11.1>,昨天咱们说到了分布式缓存键…
本文梯子 本文3.0版本文章 前言 一.swagger的一般用法 0.设置swagger页面为首页——开发环境 1.设置默认直接首页访问 —— 生产环境 2.为接口添加注释 3.对 Model 也添加注释说明 4.改写注入方法,并在控制器中参数引用 5.去掉Swagger警告提示 6.隐藏某些接口 二.结语 三.Github && Gitee 正文 本文3.0版本文章 https://mp.weixin.qq.com/s/SHNNQoYF-t8i2j85E1oSYA 前言 如果想直接在域名…
前后端分离 前面讨论了springboot下security很多常用的功能,其它的功能建议参考官方文档学习.网页版登录的形式现在已经不是最流行的了,最流行的是前后端分离的登录方式,前端单独成为一个项目,与后台的交互,包括登录认证和授权都是由异步接口来实现.在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高.这种应用模式比较适合纯网页应用, 但是当后端对接App时,App可能并不需要后端返回一个HTML网页,而…
JWT 使用 前面简单介绍了把默认的页面登录改为前后端分离的接口异步登录的方法,可以帮我们实现基本的前后端分离登录功能.但是这种基本的登录和前面的页面登录还有一个一样的地方,就是使用session和cookie来维护登录状态,这种方法的问题在于,扩展性不好.单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session. 一种解决方案是 session 数据持久化,写入redis或别的持久层.各种服务收到请求后,都向持久层请求…
前言 1.@LearningCoding 小伙伴关于用Sqlsugar在mysql数据库上的研究成果: sqlsugarcore支持mysql等数据库,在DbContext里面只需要设置dbtype为mysql即可,但是mysql8.0以上是个坑,会出现caching_sha2_password的错误,是因为root的密码类型问题,改起来挺麻烦的,所以建议使用mysql的时候安装5.6版本的即可,其他代码不需要改动. 书接上文:前几回文章中,我们花了三天的时间简单了解了下接口文档Swagger框…
单点登录(SSO) 关于oauth2.0,最后我们再来学习一下单点登录.前面介绍过单点登录的定义,单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 关于单点登录,springcloud G版本的官方文档地址如下: https://cloud.spring.io/spring-cloud-static/Greenwich.SR3/single/spring-cl…
常见问题 1.经常有小伙伴遇到这个错误 这是因为接口json文档定义和调用不是一个 1.定义: ConfigureServices 方法中的  services.AddSwaggerGen 注册的一个名字 c.SwaggerDoc("v1", 2.调用: Configure 方法中的 app.UseSwaggerUI(c =>   调用  c.SwaggerEndpoint("/swagger/v1/swagger.js: 看看两者是否一致 2.Bug调试 群里有小伙伴…
本文梯子 本文3.0版本文章 常见问题 1.Bug调试 2.经常有小伙伴遇到这个错误 3.路由重载 一.为什么使用Swagger 二.配置Swagger服务 1.引用Nuget包 2.配置服务 3.启动Http中间件 4.查看效果 5.好像少点儿什么?! 三.结语 ღ 网友反馈ღ 四.Github && Gitee 正文 本文3.0版本文章 https://mp.weixin.qq.com/s/SHNNQoYF-t8i2j85E1oSYA 常见问题 1.Bug调试 群里有小伙伴反馈,在Sw…
前言 至于为什么要搭建.Net Core 平台,这个网上的解释以及铺天盖地,想了想,还是感觉重要的一点,跨平台,嗯!没错,而且比.Net 更容易搭建,速度也更快,所有的包均有Nuget提供,不再像以前的单纯引入组件, 已经没有了之前的Assemblies和COM的引入,初次使用感觉会很别扭,不过使用多了,发现还是很方便的,所以你一定要会使用Nuget,真的很强大,这点儿设计思路感觉更像Linux了. 下边这三点,是先对 .net core  有一个初步的认识,看得懂或者看不懂都没有关系,以后大家…
本文梯子 前言 1..net core 框架性能测试 2..net core 执行过程 3.中间件执行过程 4.AOP切面 5.整体框架结构与数据库表UML 一.创建第一个Core 1.SDK 安装 2.新建项目 2.新建项目(3.0SDK) 3.项目整体结构分析 二.重要文件说明 1.Program.cs 2.Startup.cs 3.调试方法 三.注册并使用MVC 四.核心知识点 1.Routing 路由 2.内容协商 Content Negotiation 3.创建Post Action…
更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti/tree/master/Blog.Core_IOC%26DI 2.重要:如果你实现了解耦,也就是 api 层只引用了 IService 和 IRepository 的话,那每次修改 service 层,都需要清理解决方案,重新编译项目,因为这个时候你的api层的dll,还是之前未修改的代码. 3.…
添加QRcode页面代码 <template> <div class="register"> <el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form"> <h3 class="title">花神引后台管理系统&…