总结本课程练习代码:https://github.com/zq99299/spring-security.git该课程讲解的是怎么写一个可重用的安全功能项目;当然也学会了怎么使用和开发。在spring-security\doc中总结成了文档。怎么使用这些安全模块;也可以试着重新新建一个权限的项目,然后来引用这些安全模块,看能不能正常使用;不要在之前的demo上面测试了,因为那个demo是从开发中而来,肯定没有什么问题了这里是一些精华问题总结springboot启动扫描问题之前被这个问题搞得很棘手;还百度了结果还是没有明白规则。只知道扫描//注意看这里;demo启动类所在的包名packageco
SpringSecurityOAuth简介传统方式:基于session开发繁琐基于cookie:传统方式是容器和浏览器自动处理的cookie安全性和客户体验差有些前端技术不支持cookie,如小程序基于token方式:oauth*参数中携带token*可以对token更大程度的控制SpringSecurityOAuth封装了服务提供商大部分的操作;而social则是封装了客户端和服务提供商交互的流程协议中没有规定token要怎么生成和存储。springoath中规定了;除了4种的标准模式;让我们自己的自定义验证也添加到该流程中,相当于自定义认证?本章内容简介:实现一个标准的OAth2协议中的P
使用JWT替换默认令牌什么是jwt?JWT是jsonwebtoken缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。优点:在分布式系统中,很好地解决了单点登录问题,很容易解决了session共享的问题。缺点:是无法作废已颁布的令牌/不易应对数据过期。特点:自包含:包含自定义信息密签:使用指定密钥签名,防止串改,不是防止破解可扩展:也就是自定义业务信息配置jwt主要是增加了JwtTokenConfig类;为了能方便切换,使用了@ConditionalOnProperty注解;packagecn.mrcode.im
退出登录如何退出登录Springsecurity默认的退出处理逻辑与退出登录相关的配置默认退出处理逻辑使当前session失效清除与当前用户相关的remember-me记录清空当前的SecurityContext重定向到登录页还记得以前登录的时候有一个默认的登录地址:/login,同样默认了一个退出/logout;直接访问该地址:如果看到下面的报错,请检查之前开发记住我的功能的配置MonAug0623:55:25CST2018Therewasanunexpectederror(type=InternalServerError,status=500).PreparedStatementCallb
集群session管理springSecurity是基于session的安全框架。所以就会有这个问题//该项目用来做浏览器端的所以需要有session//提供集群环境下的session管理,也没有被管理到,需要自己添加//如果在启动的时候报错,可以通过配置yml文件中spring:session:store-type:nonecompile('org.springframework.session:spring-session:1.3.3.RELEASE')org.springframework.boot.autoconfigure.session.StoreType标识支持的类型,上面设置成
单机session管理到目前为止三个功能:用户名+密码登录手机号+短信登录社交网站登录前两种使用表单提交方式完成,后一种使用oath授权完成;虽然表现方式和处理流程不同,但是有一个共同点,认证后的用户信息是存放在session中的;session超时如何管理超时时间超时后如何处理session并发:a机器登录,又在b机器登录的场景下,只运行一台机器登录如何保持后来者生效,之前的失效集群session管理均衡负载如果没有做session粘连的话,会出现登录在a机器,请求数据在b机器session超时注意:server.session.timeout已经过时了server:port:80servl
绑定和解绑处理绑定和登录唯一不同的地方就是:绑定知道用户信息,登录不知道;这里也暂时不看了;知道下,以后有时间再写之前笔记中有这么一段配置,当时不知道是用来做什么的;其实就是用来提供这章节要讲的东西;//https://docs.spring.io/spring-social/docs/1.1.x-SNAPSHOT/reference/htmlsingle/#creating-connections-with-connectcontroller//必须要添加一个处理器//后补:这个是提供查询社交账户信息服务,绑定服务,等@BeanpublicConnectControllerconnectCo
开发微信登录微信大体的逻辑和qq的实现类似,但是有api相关和不太一样,要仔细分析这些不同的地方,进行适配该章节不记录,也暂时不学习。用到的时候或则有时间再继续以后尝试的时候:先自己实现,然后不行的再看代码
个性化用户认证流程2自定义登录成功处理security默认的登录成功处理是跳转到需要授权之前访问的url;而在一些场景下:比如前后分离,登录是通过ajax访问,没有办法处理301跳转;而是登录成功则返回相关的数据即可;自定义入口还是在表单登录处配置的http//定义表单登录-身份认证的方式.formLogin().loginPage("/authentication/require").loginProcessingUrl("/authentication/form").successHandler(myAuthenticationSuccessHand
添加记住我功能记住我功能的基本原理如何实现记住我的功能security记住我源码解析记住我功能的基本原理在security中认证过滤链中的org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter过滤器来实现的当没有其他的认证过滤器处理的时候,记住我这个过滤器就尝试工作如何实现记住我的功能给默认登录页面增加选项<!--名称是固定的--><inputtype="checkbox"value="true"name=&quo
图片验证码重构验证码基本参数可配置验证码校验拦截的接口可配置验证码的生成逻辑可配验证码基本参数配置三级覆盖:在最上面的会覆盖下级的配置↓请求级配置:配置值在调用接口的时候传递↓应用级配置:配置写在security-demo项目中↓默认配置:配置值写在security-core项目中图形验证码配置类packagecn.mrcode.imooc.springsecurity.securitycore.properties;/***图形验证码*@authorzhuqiang*@version1.0.12018/8/410:03*@date2018/8/410:03*@since1.0*/public
图片验证码在登录界面图形添加验证码开发生成图像验证码接口在认证流程中加入图像验证码校验重构代码开发生成图像验证码接口思路:*根据随机数生成图片*将随机数存到session中*将生成的图片写入响应中这里相当于功能,生成图片什么的不记录了。网上一大堆,记录下这里的一些代码思路由于是公用的,把该服务写在core中图片验证码信息类packagecn.mrcode.imooc.springsecurity.securitycore.validate.code;importjava.awt.image.BufferedImage;importjava.time.LocalDateTime;/***图形验证
实现标准的OAuth服务提供商写在app中,所以demo项目的依赖需要修改下dependencies{//compileproject(':security-browser')//开发app,先暂时注释掉compileproject(':security-app')本次依赖更改出错的地方有:cn.mrcode.imooc.springsecurity.securitycore.validate.code.ValidateCodeFilter中需要两个处理器,在app中先复制一份出来com.example.demo.security.MyUserDetailsService#passwordEn
SpringSecurityOAuth核心源码解析要自己实现,必须查看源码,才能知道在哪里加东西TokenEndpoint:整个流程入口点ClentDetailsService:读取第三方应用信息TokenRequest:封装了提交的参数信息TokenGranter:令牌授权者,找到一个授权模式(grant_type)进行处理都会产出两个对象OAuth2Request:处理之后的新对象Authentication:谁在授权的信息,对应用户信息(根据提交的信息查询到的用户信息,不同的模式获取的用户信息不同)OAuth2Authentication:哪一个用户在对哪一个应用进行授权,对前面信息的封
基于数据库Rbac数据模型控制权限前面都是讲的怎么在权限规则基本不变的情况下,怎么写代码控制权限;这一节要实现内管系统的场景;这些所有的信息都必须存在数据库中。因为变动频繁,员工离职、部门调动,新增权限等;通用RBAC数据模型Role-Based-AccessControl通常由三直系表,两张关系表对于资源表:存储数据的表现是某一个url的别名是菜单或则按钮;所以url和多个菜单或则按钮绑定;这样业务人员分配权限的时候才能看得懂虽然是多对多,但是可以根据业务需要,进行一对多,比如一个用户只能拥有一个角色;这个数据模型可以解决ui的显示问题和后台的程序权限控制ui显示问题:提供一个查询该用户所有
权限表达式看源码得知,最后都会转成一个表达式,然后进行投票评估;那么有哪些表达式呢?这些表达式的由来,由代码中的配置而来。.antMatchers().xxx每个函数都包装了一个表达式生成。跟着源码得到返回的是一个ExpressionUrlAuthorizationConfigurer.AuthorizedUrl对象联合使用是通过access方法,自己写表达式.antMatchers("xx").access("hasRole('ROLE_USER')andhasRole('ROLE_SUPER')")那么能自定义表达式,并且使用自己的代码逻辑来判定吗?
SpringSecurity源码解析springsecurity的基本原理之前讲解过了。这章主要看后面两个:FilterSecurityInterceptor决定该用户是否有权限访问指定的资源ExceptionTranslationFilter异常处理,如果不能访问,则处理FilterSecurityInterceptor中抛出的异常AnonymousAuthenticationFilterAnonymousAuthenticationFilter:匿名过滤器,位置固定,前面所有的都走完之后,会经过该过滤器该过滤器之前自己也是备受折磨,特别是在调试oath2的时候,在没有正确开始basic登录
SpringSecurity授权简介授权又是什么概念呢?现在来回顾下安全的概念:你是谁?你能干什么?前面讲解的全是认证,也就是解决你是谁的问题;这章讲解你能干什么的问题。很多人叫权限控制,鉴权,授权等;最终的核心目的都是一样的,控制这个用户能在系统中干什么?security对授权的定义上图意思就是说,页面能看到的只是体验和ui交互问题;而对应后台某一个url的是否能被访问被认为是权限权限场景分析两个系统的权限特点是不一样的。不应该部署在一个应用中当权限比较简单的时候,也就是对应业务系统来说这种需求;security就支持了,可以把规则写在代码中进行控制security的权限控制之前其实已经写过
基于JWT实现SSO单点登录2client1和client2添加依赖dependencies{compile('org.springframework.boot:spring-boot-starter-security')//@EnableOAuth2Sso是该包的注解compile'org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure'compile('org.springframework.boot:spring-boot-starter-web')compile'org.springfra
基于JWT实现SSO单点登录1singlesignon(SSO)的效果是什么?如上图:用户在应用a触发了登录,那么a会拿到一个jwt信息用户在应用b不用登录,会发现已经登录过了?然后返回一个jwt给应用b。完成应用b的登录这里没有搞明白是怎么控制的、后面再来完善创建项目结构不在之前的项目上继续了,之前的项目用于讲解浏览器和app不同的支持;这次的是既支持浏览器跳转也支持json返回这种。编写的代码比较简单。从零开始搭建sso需要做些什么。更容易理解;如果自己有任何需求,可以自定义的去实现合并某些功能项目结构:分别对应上图的4个角色;sso-client1sso-client2sso-demos
令牌配置接下来的内容是:基本的Token参数配置使用jwt替换默认的token扩展和解析jwt的信息token的处理在认证服务器处理的。之前已经配置了资源服务器,现在来自定义认证服务器spirngboot2的自动配置文件和1.5的不一样直接跟着视频走是不会成功的,原因如下OAuth2AuthorizationServerConfiguration类是@EnableAuthorizationServer的自动配置类;如果我们继承了AuthorizationServerConfigurerAdapter,那么该类将不会被初始化,认证服务器将不能正常工作(看源码中的条件注解声明得知)这是根据自动配置
重构注册逻辑在浏览器中的第三方登录回顾:social在拿到用户信息之后查询数据库没有绑定的用户会跳转到默认的/signUp路径提供了一个我们自己的注册页面,拿到用户提交的注册信息,调用social数据库服务,把关联信息写入数据库中。完成注册再次登录,数据库中有用户信息,则登录成功问题:上面这个流程问题所在就是第三方的信息存放在了session中;还有一个问题,就是第2步会302.需要客户端信息判定并跳转到登录页所以现在开始改造,改造方案:流程完成后,更改跳转的页面到app指定页面,根据设备id,我们把信息存放在redis中用户注册完成后,提交,再把第三方信息拿出来,合并完成注册改造注意:在改造
重构社交登录app里面的第三方登录不向浏览器中一样,一般是通过调用sdk,引导到第三方app应用登录后返回;浏览器模式可能以下两种模式;简化模式上图来看,拿到openId之后,只要我们支持使用openid登录,即可;可以大部分模仿短信验证码登录的代码,只有一点不同,提交的openid是属于social表中的数据,所以相关的用户信息SocialUserDetailsService和用户连接信息UsersConnectionRepository需要通过socaial提供的表来获取校验逻辑先看配置packagecn.mrcode.imooc.springsecurity.securityapp.so
重构短信登录现有问题如上图:浏览器中使用session存储验证码app中午cookie概念(无session)解决方案:app发送和验证验证码必须携带一个deviceId(设备id)浏览器按之前的逻辑走也就是说,这里只是验证码的存储发生了变化,那么抽出来一个存储接口,浏览器和app做不同的适配即可packagecn.mrcode.imooc.springsecurity.securitycore.validate.code;importorg.springframework.web.context.request.ServletWebRequest;/***<pre>*验证码存储仓
重构用户名密码登录让自己的逻辑获取token的话,oath前面的逻辑都不能使用。使用我们自己的逻辑来代替。也就是相当于只使用后面的功能;把自定义认证模式添加进来在AuthenticationSuccessHandle中存在authentication对象,所以只要获取到ClientDetails和TokenRequest即可;有时间了查看源码找这些吧思路提交登录请求登录成功之后,需要在上图AuthenticationSuccessHandler中获取相关信息前提条件:必须携带basicclient信息(因为需要它获取clientDetails信息)然后走后面的逻辑处理登录后的逻辑package
认证流程源码级详解之前的课程都是实现spring给出的扩展钩子。比如:自定义登录页,自定义登录成功处理等;但是是很碎片化的,在脑海中链接不起来,只知道该这样做;本章节讲述源码。认证处理流程说明认证结果如何在多个请求之间共享获取认证用户信息认证处理流程说明跟着这个流程和之前配置的地方,去一步一步的看源码;这个很重要!!AuthenticationManager管理所有的Provider,并选择适合的进行验证AuthenticationProvider验证提供者,可以自己写provider处理自己的业务场景逻辑认证结果如何在多个请求之间共享在认证成功的情况下,org.springframework
个性化用户认证流程1前面使用springsecurity默认的认证流程。处理了自定义的用户数据,密码加密;但是在实际开发中,肯定是要使用自己开发的页面、登录成功失败的业务处理等。本节内容*自定义登录页*自定义登录成功处理*自定义登录失败处理自定义登录页面在cn.mrcode.imooc.springsecurity.securitybrowser.BrowserSecurityConfig中修改配置http//定义表单登录-身份认证的方式.formLogin().loginPage("/imocc-signIn.html").and().authorizeRequests(
项目结构整体项目结构与环境搭建,我使用gradle开发,视频中是maven。且我使用的各种jar版本是springboot2的刚开始这里项目结构没有认真看视频,在开发完demo项目之后发现依赖browser项目,定义的安全配置完全不生效。这里重新来认真学习下分模块。所以如果在demo里面的笔记有关依赖相关的以这里为主。问题也不大spring-security#根目录security-app#app相关特定代码spring-browser#浏览器完全特定代码spring-core#核心业务逻辑security-demo#用来写例子,最开始的restfull相关的几节课程都是在该项目中编写讲解的;
自定义用户认证逻辑处理用户信息获取逻辑处理用户校验逻辑处理密码加密解密注意!注意!视频中启动的是demo。而这次要写的代码在security-browser中。遇到一个问题也就是在项目结构一文中最后的关于依赖项目没有被扫描到的问题;如果按照笔记走出现了这个问题。就去项目结构中关于”关于依赖项目没有被扫描到的问题”解决处理用户信息获取逻辑org.springframework.security.core.userdetails.UserDetailsServiceUserDetailsService接口用于加载用户特定的数据,它在整个框架中作为用户DAO使用,是验证提供者使用的策略。该接口只需要
SpringSecurity慕x网课程笔记;包括内容如下MySQLWorkbench官方客户端;sql客户端securityoauth2socialspringsecurityspringoauth2后补:重要事情**在某些情况下,当你找不到错误问题的时候,不妨把日志级别调整为debug**目录:实战练习代码:https://github.com/zq99299/spring-securitySpring开发技巧开始开发项目结构使用SpringMVC开发RESTfulAPI查询请求编写用户详情服务处理创建请求用户信息修改和删除服务异常处理使用切片拦截rest服务rest服处理文件上传异步处理r