6-Spring Security
- JAAS: Java Authentication Authorization Service. JDK提供的认证授权服务
1. 👍Spring Security
划分为两类:
- 针对客户web请求权限控制
- 针对方法级的权限控制
- 针对业务层代码
- 调用前控制,调用后控制
- 例:对数据库delete操作做权限控制
在spring中使用:添加依赖
spring-boot-starter-security
后会自动加载安全相关的bean
2. Cookie
维持客户端与服务端长时间的会话。
- http是无状态的协议,cookie可以保存状态
- 例:保持用户登录状态
用户登录后,服务端会返回session-id,作为cookie存在本地每次请求都带上cookie
3. Web请求拦截
- spring data权限认证的原理:使用servlet容器的filter
Spring Security是一种基于Spring AOP和Servlet过滤器的安全框架,它在Web请求级和方法调用级处理身份确认和授权。Spring Security通过一系列的Servlet Filter实现这些功能。当添加了@EnableWebSecurity注解之后,Spring会创建一个名为springSecurityFilterChain的Bean,其类型为DelegatingFilterProxy。这是一个特殊的Servlet Filter,它将工作委托给一个javax.servlet.Filter的实现类(其类型为FilterChainProxy),这个实现类作为一个Bean注册在Spring的应用的上下文中。
对于一个请求,其处理顺序是:DelegatingFilterProxy => FilterChainProxy => 一系列的Filter => Controller
4. 👍开发人员还要做什么
除了框架提供的,开发人员还需要做什么,很重要
- 实现接口
UserDetailsService
接口:给Spring框架提供用户详细信息。用户信息注册存储,需要用到用户信息的时候从数据访问层获取- 这里用到之前讲到数据访问层实现技术。
- 和spring security解耦,只需要提供用户信息但不关心怎么实现。
- 被Spring Security调用
- 实现密码加密/解密对象
- PasswordEncoder
- Bean对象
- (optional)实现登录页面
- 有默认页面
/login
, Spring已经自动实现了对应的Controller
- 权限设定
SecurityFilterChain
,基于注入的httpSecurity
对象- 继承父类
WebSecurityConfigurerAdapter
,实现configure
方法
- PasswordEncoder:密码不能明文存储,需要加密后再存到数据库里
- 需要定义
Bean
- 需要定义
5. 框架实现了什么
- 实现用户登录控制器get post
- 请求重定向到用户登录页面
- eg.用户未登录时,访问URL,服务端重定向到登录页面
- 通过Filter对用户设定的权限进行权限控制
6. 👍用户信息存储
来自多个渠道,spring security不关心。
- 内存用户数据库
- JDBC用户存储
- 不止是JDBC、关系型数据库,只要是持久化的都算
- LDAP用户数据库
- 轻量级目录数据库
7. 权限分类
- Authority,权限
- Role,角色
权限,加前缀:ROLE_ - 从角色到权限
8. 自定义登录页面
使用HttpSecurity
对象配置。
- 当需要认证时转向的登录页:
.loginPage("/login")
- 视图控制器,定义login请求对应的视图:
registry.addViewController("/login")
; - 登录的post请求由Spring Security自动处理,名称默认:
username
、password
,可配置
1 | formLogin() |
9. 👍启用HTTP Basic认证
HTTP协议内容,与Spring框架无关。
由于用户 ID 与密码是是以明文的形式在网络中进行传输的(尽管采用了 base64 编码,但是 base64 算法是可逆的),所以基本验证方案并不安全。
- 启用HTTP basic认证:
httpBasic()
- 默认关闭
- 在请求时带上用户名密码,一般在测试的时候使用
Authorization
属性https://username:password@www.example.com/
HTTP authentication - HTTP | MDN
10. CSRF
- 跨站请求伪造
- 攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
- 默认开启
- 如何关闭:
.csrd().disable()
- 如何忽略:
.ignoringAntMatchers("/admin/**")
例子:
- 受害者登录a.com,并保留了登录凭证(Cookie)。
- 攻击者引诱受害者访问了b.com。
- b.com 向 a.com 发送了一个请求:a.com/act=xx。浏览器会默认携带a.com的Cookie。
- a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。
- a.com以受害者的名义执行了act=xx。
- 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作。
解决:C每次提交表单A,_csrf 字段有唯一ID,无法伪造
- get得到
_csrf
, post请求携带_csrf
,防止第三方伪造 - 不在cookie中
- get得到
前端安全系列(二):如何防止CSRF攻击? - 美团技术团队
11. CORS:跨域资源共享
- 是由浏览器定义的协议
- 常用于客户端与服务端分离的场景
- 例:A提供静态页面,B提供Rest接口
12. 在后端代码获得当前登录的用户信息
- 注入
Principal
对象- 来自
java.security
,是JDK中JASS的低层框架 String username = principal.getName()
获取用户名
- 来自
@AuthenticationPrincipal
注解- 来自
Spring Security
@AuthenticationPrincipal User user
作为函数参数获得user对象
- 来自
- 安全上下文获取
1 |
|
- 标题: 6-Spring Security
- 作者: Charlie
- 创建于 : 2023-10-16 18:10:00
- 更新于 : 2024-07-05 12:55:04
- 链接: https://chillcharlie357.github.io/posts/b9233e24/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。