6-Spring Security

Charlie
  • JAAS: Java Authentication Authorization Service. JDK提供的认证授权服务

1. 👍Spring Security

  • 划分为两类:

    1. 针对客户web请求权限控制
    2. 针对方法级的权限控制
      • 针对业务层代码
      • 调用前控制,调用后控制
      • 例:对数据库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

深入了解Spring Security的实现原理 - 知乎

image.png

4. 👍开发人员还要做什么

除了框架提供的,开发人员还需要做什么,很重要

  1. 实现接口
    • UserDetailsService接口:给Spring框架提供用户详细信息。用户信息注册存储,需要用到用户信息的时候从数据访问层获取
      • 这里用到之前讲到数据访问层实现技术。
      • 和spring security解耦,只需要提供用户信息但不关心怎么实现。
    • 被Spring Security调用
  2. 实现密码加密/解密对象
    • PasswordEncoder
    • Bean对象
  3. (optional)实现登录页面
    • 有默认页面
    • /login, Spring已经自动实现了对应的Controller
  4. 权限设定
    1. SecurityFilterChain,基于注入的httpSecurity对象
    2. 继承父类WebSecurityConfigurerAdapter,实现configure方法

image.png

  • PasswordEncoder:密码不能明文存储,需要加密后再存到数据库里
    • 需要定义Bean

5. 框架实现了什么

  1. 实现用户登录控制器get post
  2. 请求重定向到用户登录页面
    • eg.用户未登录时,访问URL,服务端重定向到登录页面
  3. 通过Filter对用户设定的权限进行权限控制

6. 👍用户信息存储

来自多个渠道,spring security不关心。

  1. 内存用户数据库
  2. JDBC用户存储
    • 不止是JDBC、关系型数据库,只要是持久化的都算
  3. LDAP用户数据库
    • 轻量级目录数据库

7. 权限分类

  • Authority,权限
  • Role,角色权限,加前缀:ROLE_
    • 从角色到权限

8. 自定义登录页面

使用HttpSecurity对象配置。

  • 当需要认证时转向的登录页:.loginPage("/login")
  • 视图控制器,定义login请求对应的视图:registry.addViewController("/login");
  • 登录的post请求由Spring Security自动处理,名称默认:usernamepassword,可配置
1
2
formLogin()
.loginPage("/login").usernameParamrter('username').passwordParameter('password')

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/**")

image.png

  • 例子:

    1. 受害者登录a.com,并保留了登录凭证(Cookie)。
    2. 攻击者引诱受害者访问了b.com。
    3. b.com 向 a.com 发送了一个请求:a.com/act=xx。浏览器会默认携带a.com的Cookie。
    4. a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。
    5. a.com以受害者的名义执行了act=xx。
    6. 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作。
  • 解决:C每次提交表单A,_csrf 字段有唯一ID,无法伪造

    • get得到_csrf, post请求携带_csrf ,防止第三方伪造
    • 不在cookie中

image.png

前端安全系列(二):如何防止CSRF攻击? - 美团技术团队

11. CORS:跨域资源共享

  • 是由浏览器定义的协议
    • 是一种基于 HTTP  头的机制,该机制通过允许服务器标示除了它自己以外的其他(域、协议或端口),使得浏览器允许这些源访问加载自己的资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的“预检”请求。在预检中,浏览器发送的头中标示有 HTTP 方法和真实请求中会用到的头。
  • 常用于客户端与服务端分离的场景
    • 例:A提供静态页面,B提供Rest接口

12. 在后端代码获得当前登录的用户信息

  1. 注入Principal对象
    • 来自java.security,是JDK中JASS的低层框架
    • String username = principal.getName()获取用户名
  2. @AuthenticationPrincipal注解
    • 来自Spring Security
    • @AuthenticationPrincipal User user作为函数参数获得user对象
  3. 安全上下文获取
1
2

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); User user = (User) authentication.getPrincipal();
  • 标题: 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 进行许可。
评论