目录
两个核心
用户认证(Authentication):
通俗点说就是系统认为用户是否能登录
用户授权(Authorization):
通俗点讲就是系统判断用户是否有权限去做某些事情
两个安全框架
springSecurity框架对比
特点:与Spring 无缝整合、全面的权限控制、重量级。
特别注意:新旧版本的区别
◼
旧版本不能脱离 Web 环境使用。
◼
新版本对整个框架进行了分层抽取,分成了核心模块和 Web 模块。单独 引入核心模块就可以脱离 Web 环境。
shiro框架
特点:轻量级,简单
。
◼好处:不局限于 Web 环境,可以脱离 Web 环境使用
。
◼
缺陷:在 Web 环境下一些特定的需求需要手动编写代码定制
三个主要过滤器:
FilterSecurityInterceptor
:是一个
方法级的权限过滤器
,
基本位于过滤链的
最底部
。
![](https://img-blog.csdnimg.cn/20210529114037436.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NDIzMjU2,size_16,color_FFFFFF,t_70)
ExceptionTranslationFilter
:是个异常过滤器,用来处理在认证授权过程中抛出的异常。
![](https://img-blog.csdnimg.cn/2021052911281799.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NDIzMjU2,size_16,color_FFFFFF,t_70)
UsernamePasswordAuthenticationFilter
:对
/login
的
POST
请求做拦截,校验表单中用户 名,密码
![](https://img-blog.csdnimg.cn/20210529113511452.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NDIzMjU2,size_16,color_FFFFFF,t_70)
注意这里如果用表单提交时必须是post请求,并且表单中用户名和密码的属性必须是username和 password
springSecurity过滤器加载过程
springSecurity中过滤器的是如何加载的?
源码分析
第一步:通过DelegatingFilterProxy过滤器中initDelegate方法进行初始化
![](https://img-blog.csdnimg.cn/20210529175225817.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NDIzMjU2,size_16,color_FFFFFF,t_70)
第二步:执行initDelegate方法,获取filterchainProxy过滤器(即下面从webApplicationContext中通过targetBeanName获取到)
![](https://img-blog.csdnimg.cn/20210529175308264.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NDIzMjU2,size_16,color_FFFFFF,t_70)
第三步:通过FilterChainProxy过滤器中,获取到所有的过滤器加载到过滤器链中
![](https://img-blog.csdnimg.cn/20210529180008320.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NDIzMjU2,size_16,color_FFFFFF,t_70)
两个重要的接口
UserDetailsService接口
该主要处理实际项目开发中用户名和密码都是从数据库中查询,而不是由springSecurity在控制台生成密码,因此需要自定义认证控制逻辑,此逻辑通过实现
UserDetailsService接口来实现。
默认的登录用户名和密码的逻辑是通过UsernamePasswordAuthenticationFilter过滤器实现认证登录的。
![](https://img-blog.csdnimg.cn/20210529184101143.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NDIzMjU2,size_16,color_FFFFFF,t_70)
而实际开发中需要做我们自己的登录认证时
只需要自定义一个过滤器继承UsernamePasswordAuthenticationFilter,
然后重写三个方法attemptAuthentication、successfulAuthentication及unsuccessfulAuthentication方法即可.
而从数据库查询用户的用户名和密码信息就是在UserDetailsService接口的实现类中实现,且注意的是从数据库中查询的用户对象USER必须是springSecurity提供的才行。
PasswordECnodeer接口
该接口主要是对用户密码进行加密处理