传送门
SpringMVC的源码解析(精品)
Spring6的源码解析(精品)
SpringBoot3框架(精品)
MyBatis框架(精品)
MyBatis-Plus
SpringDataJPA
SpringCloudNetflix
SpringCloudAlibaba(精品)
Shiro
SpringSecurity
java的LOG日志框架
Activiti(敬请期待)
JDK8新特性
JDK9新特性
JDK10新特性
JDK11新特性
JDK12新特性
JDK13新特性
JDK14新特性
JDK15新特性
JDK16新特性
JDK17新特性
JDK18新特性
JDK19新特性
JDK20新特性
JDK21新特性
其他技术文章传送门入口
前言
本质就是一串过滤器配合实现的认证与授权功能,对,你没看错,全都是过滤器。
然后还有一个规约,OAuth2.0规约,腾讯QQ、微信、等等都遵守这个规约,典型应用就是QQ快捷登录、微信快捷登录,很多网站都支持QQ快捷登录,你本来登录的是A网站,结果用的是你自己的QQ账号和密码。
SpringSecurity入门篇
SpringSecurity升级篇
一、高级篇概念
1、入门案例
就引入个依赖,什么注解也没加,访问普通接口,就出现security的登录页面了,用户名固定user,密码是启动生成的随机密码。
2、本质
是一个过滤器链(十几个,34个?)
本质就是十几个过滤器组成过滤器链处理
SpringBoot帮我们配置了第一个步骤,就是DelegatingFilterProxy(本质就是将所有Security的过滤器加载到过滤器链),所以我们不用再配置这步了。
二、web权限方案(单机版)-入门篇
1、四个个核心过滤器
U开头这个是认证的核心过滤器,就这一个,而且应该是security优先级第二批次的过滤器(不是很确定,反正在前面)。剩余两个是授权的核心过滤器。F开头那个又是security框架优先级最末的过滤器。
优先级第一的过滤器,将Authentication和Session进行绑定的牛逼过滤器
四个核心过滤器
2、设置登录用户名和密码(四种方式)
方式一
方式一 : 配置yml文件
方式二
方式二:配置类 (这个Config类要继承一下WebSecurityConfigurerAdapter类)
配置类方式,就这边这一个类就搞定了
方式三
方式三 自定义编写实现类 在方式二的基础上,主要是实现UserDetailsService接口,实现用户名和密码从数据库取值
方式三强化转 查询数据库
方式四
其实还有方式四,就是写一个过滤器 extends UsernamePasswordAuthenticationFilter;
然后 重写三个方法
第一 重写 继承类父类也就是爷爷类里面的 认证成功和认证不成功两个方法
第二 重写 继承类的attemptAuthentication方法 (尚硅谷视频最后阶段就是用的方式四,个人觉得像产融平台这种方式三更简单,更舒服,只是不知道security框架的人,不好找,而方式四是个过滤器,相对更好理解。)
方式四系列截图
3、自定义设置登录页面
三、web权限方案(单机版)-权限认证
1、四个方法(五个)
hasAuthority
admins权限
admins权限对应起来。
hasAnyAuthority
配置文件中访问规则 里面有 两个 权限
登录用户只要有其中任何一个 就有权限访问
hasRole
源码
db数据库查询的要自己拼接ROLE_前缀
配置类 加角色 sale,源码会自动将该角色变为 ROLE_sale,所以注意数据库存的sale,在写代码的时候要拼接一下ROLE_前缀。
hasAnyRole
access
SpEL表达式,可以创建复杂的限制
2、自定义403页面
3、注解使用
注解判断是否有角色
方法访问前验证(配合四大方法)
方法访问后验证(配合四大方法)
对返回的数据再次进行过滤。案例中只返回 username=admin1的数据,其他数据不返回。
对传入的参数进行过滤。案例中能被2整除的id就是参数传过来,不能的就不传过来
4、注解对应代码
加上前缀ROLE_
@Secured(“ROLE_sale”)
@PreAuthorize(“hasAnyAuthority(‘menu:system’)”)
5、注解总结图
6、注销
7、记住我功能(类似10天内免登录)
原理图
备注:接口认证通过后,关闭浏览器,再次访问这个接口时不用再次输入登录账号和密码去验证,直接就可以访问成功。
原理:第一次接口认证通过后,会给浏览器发一个cookie加密串,并且这个串同时存到了数据库(源码里面会创建一张persistant_logins的表);
浏览器关闭再次打开后二次访问接口时,会带上这个cookie加密串,然后和数据库对比,对比成功后,不用再次输入登录账号和密码去验证,直接就可以访问成功。
深坑,还得前端页面搞个复选框,而且name必须叫remember-me这种。
深坑啊
8、CSRF理解
默认开启了保护,但是get这种请求不支持保护。
默认是开启的,如果不关闭,前端html页面就必须得写后面截图那些固定标签,不然就验证不通过。所以还是设置关闭了。
还得需要前端html支持
四、微服务权限方案-入门篇
1、概念
2、入门案例
认证过滤器
授权过滤器
配置类的小扩展功能
五、微服务权限方案-源码分析(王炸)
1、认证流程源码分析
认证核心流程(UserDetailsService就在 这个UsernamePasswordAuthenticationFilter里面,看这样子这个过滤器也是security框架优先级第一的过滤器)
1到2步:不是post提交就直接放行了
3到4.1步
3到4.2步,特别注意4.2就是把 上下文 SecurityContextHolder.getContext().setAuthentication(authResult);设置了。就是这步设置的上下文哦。因为在2大步里面就关联了UserDetailsService查询了数据库的。所以这边4.2的authResult也就是Authentication接口已经有非常足够的信息了。
之前的第二大步进行具体解析,也就是2.1到2.2步了
这步最后一句代码就调用UserDetailsService了 ,也就是2.3步了,最后一句返回的就是Authentication接口,上面代码是未标记状态,最后一句后就变成了标记状态了。 最后一句代码 AuthenticaitonManager也是个接口,有个牛逼实现类ProviderManager。
对2.3步进行解析了,也就是2.31步,因为是对第二大步既 2 的详细解析,2这步返回了Authentication接口。
2.32步,AuthenticaitonManager也是个接口,有个牛逼实现类ProviderManager。AuthenticationProvider provider 也是个接口,有非常多实现类,其中一个实现类DaoAuthenticationProvider 就是和UserDetailsService关联了。
2.32步的实现类
2、认证流程图的补充
3、授权流程源码分析
4、授权流程图补充
5、请求间共享认证信息(源码分析)
源码分析
六、分布式
1、概念
肯定不用session,这玩意太耗费服务器性能
token是时代的宠儿
分布式最终架构图
2、OAuth2.0
3、github的OAuth2案例
登录github官网在到设置里面
第一次输入,要生成个秘钥
yml配置
pom的引入
注意 还不能用上面的Enable的注解 注意 截图错误 是 @Configuration 实际测试中,加上@Configuration也不行,都不加才可以,感觉就是没让security配置生效才管用。(测试证明,把整个security的配置干掉,都可以的。)
关键就是把这个配置出来
输入 http://localhost:8088/login后跳转到这个页面
点击github跳转到这边。登录以后跳转到报错页面,因为主要没有前端代码,所以404。 这个时候输入 新地址 hello等,就可以访问了。