认证授权服务
详情查看:认证授权服务 (opens new window)
# 1. 介绍
什么是用户身份认证?
用户身份认证即当用户访问系统资源时,系统要求验证用户的身份信息,身份合法方可继续访问,在SpringCloud gateway实现
什么是用户授权?
用户认证通过后去访问系统的资源,系统会判断用户是否拥有访问资源的权限,只允许访问有权限的系统资源,没有权限的资源将无法访问,这个过程叫用户授权。例如用户去发布课程,系统首先进行用户身份认证,认证通过后继续判断用户是否有发布课程的权限
# 2. 业务流程
项目包括学生、学习机构的老师、平台运营人员三类用户,三类用户将使用统一的认证入口
有访问微服务的请求都要经过网关,在网关进行用户身份的认证,可以将很多非法的请求拦截到微服务以外,这叫做网关鉴权
网关鉴权的职责
- 网站白名单维护:针对不用认证的URL全部放行(例如请求认证的请求就在白名单内,会访问授权认证微服务模块)
- 校验JWT的合法性:除了白名单剩下的就是需要认证的请求,网关需要验证JWT的合法性,JWT合法则说明用户身份合法,否则说明身份不合法,拒绝继续访问
网关不负责授权,对请求的授权操作在各个微服务进行,因为微服务最清楚用户有哪些权限访问哪些接口
# 3. 工作原理
- 用户提交用户名、密码被SecurityFilterChain中的UsernamePasswordAuthenticationFilter过滤器获取到,封装为请求Authentication
- 然后过滤器将Authentication提交至认证管理器(AuthenticationManager)进行认证, 然后DaoAuthenticationProvider调用UserDetailsService的loadUserByUsername()方法根据用户名从数据库中获取UserDetails用户信息对比认证
- 认证成功后,AuthenticationManager身份管理器返回一个被填充满了信息(权限信息、身份信息、细节信息等,但密码通常会被移除)的Authentication实例
- SecurityContextHolder将第三步填充了信息的Authentication通过SecurityContextHolder.getContext().setAuthentication()方法,设置到其中。
返回的Authentication实例就是颁发的令牌,令牌中已经包含了用户拥有的资源访问权限,后续微服务接口中只需要解析令牌就可以判断用户是否具有权限访问
我们需要扩展用户身份信息,在JWT令牌中存储用户的昵称、头像、QQ等信息如何扩展Spring Security的用户身份信息呢?
在认证阶段DaoAuthenticationProvider会调用UserDetailsService查询用户的信息,这里是可以获取到齐全的用户信息。
由于JWT令牌中用户身份信息来源于UserDetails,UserDetails中仅定义了username为用户的身份信息,这里有两个思路
- 扩展UserDetails,包括更多的自定义属性
- 扩展username的内容,例如存入Json数据作为username的内容(容易实现,也不用破坏UserDetails的结构)
编辑 (opens new window)
上次更新: 2024/12/28, 07:52:50