1. 我们都知道SpringSecurity是做权限管理的,
权限管理:基本上涉及到用用户的系统都会 进行权限管理
权限管理包括认证和授权。
认证: 对用户访问系统的控制
授权:对已经认证的用户进行授权, 对已经认证的用户再做安全规则 或者说访问控制 控制用户可以访问不同的资源
行业内的解决方案
1.shiro 简单 轻量 易于集成, 但是 在微服务时代扩展性不高
比如Shiro则需要自己手动实现集成Oauth2.0,SpringSecurity 对Oauth的有支持
2.springsecurity spring家族的 加上现在springboot的自动装配,以及springcloud的一站式开发,功能强大,但是缺点就是繁琐 学习成本高
3.自定义权限框架 权限管理并不是 做个登录 授权,还得做 黑白名单
网络攻击什么的 网络安全的时候 一般在大公司中会自己去做
2.SpringSecurity的整体架构
Springsecurity的核心是用来做权限管理的 一个认证 一个授权
也就是说核心功能是完成认证授权的
认证和授权分开,认证和授权是2个完全独立的操作
使用那种认证方式 都不会影响授权操作,这样的话可以非常方便的整合一些外部的解决方案
比如
认证的时候 去整合外部的认证方案
授权的时候 去整合外部的授权方案
入参 Authentication是用来封装账号密码的
返回值是Authtion 代表认证成功了 如果 抛异常 代表认证失败了
Authentication 他里面包含的用户的身份信息 是否被认证了~权限什么的
授权先不看 我们先看下环境搭建
1.pom
2.写一个test类
3. springsecurity 启动类
我们先写一个Springboot项目
Springboot项目跑起来了 并且很成功 现在我在pom 中加入
Springsecurity的jar
当我再次访问 http://localhost:8080/login 的时候就会
弹出这样一个界面 就代表Springsecurity已经拦截了我们请求
可以看到, 当我们引入Springsecurity 的pom后
所有接口都应该去做认证
springsecurity 如何帮我们保护系统中的受限资源
默认对所有进行保护 无需任何配置
默认账号是user 密码就是 下图中的
我们可以看到 当我们引入Springsecurity的jar之后,springsecurity 默认帮我们进行了自动配置
默认要求我们所有的请求都认证了才能自动访问, 所有的资源都是受保护资源
这就是 Spring Security 的强大之处,只需要引入一个依赖,所有的接口就会自动保护起来!
1.为什么引入Springsecurity 之后, 没有任何配置 所有请求都要求认证呢
2.项目中没有登录页面,登录页面怎么来的呢
3. 为什么使用User和控制台密码就可以登录 登录时 数据源又在哪里做匹配呢
在 Spring Security 中 `认证、授权` 等功能都是基于[过滤器]
当我们引入Springsecuriy的jar 后就会有很多默认的Filter 这些Filter 有的会默认开启 当我们引入jar 的时候
看吧,在springsecurity 的pom引入进来的话 ,会创建一个
springSecurityFilterChain 的过滤器链 这个过滤器链 默认
会加载一些过滤器
这个类是Springboot对Springsecurity 的默认配置 也就是说的自动装配
http
.authorizeRequests() //开启请求的权限认证
.anyRequest() // 任何请求
.authenticated()// 都要求认证
.and()
.formLogin()// 认证方式 表单认证
.and()
.httpBasic();// 认证方式 basic
意味着我默认这里要对http的所有请求去进行认证之后才能访问 同时支持表单以及httpbasci
既然我们是form表单认证认证 我们就得知道
当前你发送的hellow请求 并没有做认证 会抛出一个异常 之后就会交给异常处理器来处理这个异常 处理这个异常的时候
就会根据请求,响应302,请求地址是login 的url
并且会响应一个页面
// 然后就会有DefaultLoginPageGeneratingFilter 生成默认页面
当我们form表单认证的时候 就会发送
http://localhost:8080/login 的请求
就会被
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#attemptAuthentication
拦截到
// 主要的还是这个 authenticate(authRequest); 方法
return this.getAuthenticationManager().authenticate(authRequest);
//看他此时的userDetail对象是从内存种根据user加载过来的 如果能找到这个user账号 就可以比对成功
内存种其实就是一个User的map
然后我们可以重启下项目 可以看到在Springsecurity加载的时候
就可以看到 就可以加载一个
InMemoryUserDetailsManager 这个内存的user对下给你
然后就会创建一个user 对象
我也可以自定义用户密码
// 然后就可以看到我们的user对象 的账号密码了~ 密码前面加个noop 代表是明文存储
如果我们的user对象可以获取到 就代表我们已经成功认证了
如果获取不到就会抛异常,只是我们目前的user对象存储在内存中
1.现在我们可以知道个大概流程了
就是说我们引入Springsecurity 的jar,springboot会对我们进行一个自动装配
用的是默认的配置,所有的http请求都必须开启权限保护,
任何请求都必须认证之后之后才可以访问,而默认提供了表单认证和
basic认证
2. 当我们访问受限资源的时候,比如说/hello.就会被一系列的filter拦截到,当前的hello请求,并没有做认证,会抛出一个异常
然后处理这个异常的时候就会根据请求,响应302,请求地址是login 的url ,并且会生成一个页面
@ConfigurationProperties(prefix = "spring.security") //可以配置
3. 当我们root/root {密码可以配置 {noop}代表明文的意思}登录时候 我们实际上是依赖于内存的数据源进行比对的