关于Spring Security的基础概念以及原理解析

SpringSecurity是一个用于身份验证和授权的框架。它涉及UserDetails存储用户信息,UserDetailsService接口用于获取用户信息,SecurityContextHolder保存安全上下文,Authentication对象包含用户认证和权限信息,AuthenticationManager负责验证Authentication。流程包括用户登录时的认证和权限检查,以及后续请求的权限验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Spring Security概念

它主要是用于身份验证和授权的框架

关于身份验证,就是说你当前权限能不能访问该信息。

关于授权,可以理解为 我把这个页面访问权限授予你,你就可以进去访问或者操作

2.主要核心类

1.UserDetails

主要是用与储存用户信息,用户实体类进行实现UserDetails

2.UserDetailsService

我们自定义类进行实现UserDetailsService接口,当我们实现里面的loadUserByUsername(String username)方法时,我们可以通过查询数据库或缓存获取用户信息,然后返回UserDetails。在实现方法时,如果我们没有查找到该用户,就会抛出异常。我们SysUser实体类不是重写了UserDetails,这样通过其getAuthorities()可以获取到用户的权限信息。

 3.SecurityContextHolder

SecurityContextHolder用与储存安全上下文(SecurityContext)的信息,就是用与存储身份信息,认证信息的容器SecurityContextHolder默认使用 ThreadLocal策略来存储认证信息,即一种与线程绑定的策略,每个线程执行时都可以获取该线程中的 安全上下文(security context),各个线程中的安全上下文互不影响。。
ThreadLocal策略有:1.MODE_THREADLOCAL:SecurityContext 存储在线程中。

2.MODE_INHERITABLETHREADLOCAL:SecurityContext 存储在线程中,但子线程可以在父线程中获得 SecurityContext。

3.MODE_GLOBAL:SecurityContext 所有线程都是一样的。

默认情况下,SecuritycontextHolder使用MODE_THREADLOCAL模式,即存储在当前线程中。

4.SecurityContext

安全检索上下文内容,它主要作用就是获取Authentication对象,当验证信息通过验证后将用户信息和权限信息保存在Authentication对象。

5.Authentication

authentication 在Spring的意思中 Security Authentication用于表示当前用户是谁

getAuthorities: 获取用户权限,通常获取用户的角色信息。

getCredentials: 获取证明用户认证的信息,通常是密码和其他信息。

getDetails: 获取用户的额外信息(这部分信息可以是我们用户表中的信息)

getPrincipal: 获取用户身份信息,在未经认证的情况下获取用户名,在认证的情况下获取用户名 UserDetails (Userdetails也是一个接口,其中包括getusername、getpassword等。)

 6.AuthenticationManager

AuthenticationManager 其功能是验证Authentication,如果验证失败,将抛出Authenticationexception异常。Authenticationexception是一个抽象类,因此代码逻辑不能实例化Authenticationexception异常和抛出

3.个人简单使用流程(主要分为认证和授权)

1.先使用类继承WebSecurityConfigurerAdapter实现其方法

1.配置白名单,因为用户登录不需要传token进行权限验证

2.完成核心配置 如完成对token的校验和用户访问权限。

 2.用户开始登录流程  传用户名和密码

        1.使用userDetailsService.loadUserByUsername(username)去数据库中查询用户数据和用户权限等信息。

        2.通过passwordEncoder.matches() 判断密码是否正确

        3.使用UsernamePasswordAuthencationToken将用户基本信息和用户权限信息封装

         4.将authenticationToken保存进去SecurityContextHolder.getContext.setAuthentication()。

关于用户访问权限就是通过我们保存在Authentication的UserDetails信息中的权限信息跟request的url进行对比,包含了就可以访问。 

4.总结

认证流程开始,首先通过SecurityContextPersistenceFilter生成一个SecurityContext(安全上下文),
之后的fifter之间的信息传递全靠这个来实现。

1.前端传来的userName和password,在进行认证的时候需要一个 
  UserDetailsService 来获取用户的信息 UserDetails,
  这个UserDetailsService由程序员自己实现,
  从数据库查出用户信息,封装成UserDetails对象返回即可。

2.将UserDetails传入UsernamePasswordAuthenticationToken方法,
  生成一个Authentication。
3.通过SecurityContextHolder.getContext();获取到SecurityContext
4.将Authentication存入到SecurityContext.setsetAuthentication()中完成认证

当用户传token进行访问数据的时候,以及访问其他页面或者接口的权限
1. token验证
   Authentication和通过前台传来的userName和password生成的Authentication		 				
   如果认证成功调用AuthenticationSuccessHandler实现类方法,
   如果认证失败调用AuthenticationFailureHandler实现类方法。

2.访问权限
  通过FilterSecurityInterceptor过滤器来比对:
  Authentication(通过数据库查询出来的认证信息)里面的权限列表
  和requst中的url
  如果匹配得到,那可以通过,否则就不能访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值