前后台分离登录认证

用户认证问题,分为首次登陆,和二次认证。

  • 首次登录认证:用户名、密码和验证码完成登录

  • 二次 token 认证:请求头携带 Jwt 进行身份认证

一、前后台分离登录校验流程

流程:

  1. 前端携带用户名,密码访问登录接口
  2. 后端查询数据库,验证是否登录成功。如果正确,生成一个token
  3. 后端把token响应给前端
  4. 前端登录之后的访问请求接口,需要在请求头中携带token
  5. 后端获取请求头token,进行解析,获取UserId,根据Userd获取用户相关信息,如果有权限,则允许访问相关资源访问目标资源,响应给前端

二、SpringSecurity的认证流程

本质

SpringSecurity采用的是责任链设计模式, 本质是一个过滤器链。

责任链模式

  • 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。

  • 在这种模式中,通常每个接收者都包含对另一个接收者的引用,而连接起来形成一条链。

  • 请求在这个链上传递,直到链上的某一个对象决定处理此请求。

  • 如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

核心

SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。

图中只展示了核心过滤器,其它的非核心过滤器并没有在图中展示:

  • UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请求。入门案例的认证工作主要有它负责。
  • ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException 。
  • FilterSecurityInterceptor:负责权限校验的过滤器。我们可以通过Debug查看当前系统中SpringSecurity过滤器链中有哪些过滤器及它们的顺序。

我们也可以通过debug,查看SpringSecurity的过滤器链:

在我们的启动类添加对应的断点

在引入Spring Security依赖之后开发者不做任何配置时Spring Security会为我们加载一部分过滤器:

  • SecurityContextPersistenceFilter:在请求处理之前将安全信息加载到SecurityContextHolder中方便后续使用。请求结束后,在擦除SecurityContextHolder中的信息。

  • CsrfFilter:处理CSRF攻击

  • LogoutFilter:处理注销登录

  • UsernamePasswordAuthenticationFilter :处理填写了用户名密码的登陆请求——从表单中获取用户名密码,并进行身份验证。

  • DefaultLoginPageGeneratingFilter:配置默认登录页面

  • DefaultLogoutPageGeneratingFilter:配置默认注销页面

  • BasicAuthenticationFilter:处理HttpBasic登录

  • ExceptionTranslationFilter :异常过滤器,捕获过滤器链抛出的异常并进行处理,主要处理AccessDeniedException 和AuthenticationException 异常。

  • FilterSecurityInterceptor:根据资源权限配置来判断当前请求是否有权限访问对应的资源,如果访问受限会抛出相关异常,并由ExceptionTranslationFilter 过滤器进行捕获和处理。是过滤器链的最后一个过滤器,是过滤器链的出口。

认证流程详解

  • Authentication接口: 它的实现类,表示当前访问系统的用户,封装了用户相关信息。
  • AuthenticationManager接口:定义了认证Authentication的方法
  • UserDetailsService接口:加载用户特定数据的核心接口。里面定义了一个根据用户名查询用户信息的方法。
  • UserDetails接口:提供核心用户信息。通过UserDetailsService根据用户名获取处理的用户信息要封装成UserDetails对象返回。然后将这些信息封装到Authentication对象中。

修改为自定义认证流程

思路分析

登录:

  1. 自定义登录接口

  2. 调用ProviderManager的authenticate()方法进行认证,如果认证通过,则生成JWT

  3. 把用户信息存入redis中

  4. 自定义UserDetailsService接口实现类

  5. 我们在这个实现类查询数据库

校验:

  1. 定义JWT认证过滤器

  2. 获取token

  3. 解析token获取其中的uuid

  4. 从redis中获取用户信息

  5. 存入SecurityContextHolder

总结

从基本认证流程中不难看出,我们可以重写或者替换UsernamePasswordAuthenticationFilter过滤器,用以添加我们需要的业务处理逻辑,并且可以实现UserDetailsService接口,加入Spring Data JPA或者Mybatis用来访问数据库中的用户信息

### 回答1: Android Studio是一款为安卓应用开发提供全套解决方案的IDE。当下,越来越多的应用程序集成了后台分离的技术,这种技术能够充分利用网络的优势分散负载,提高资源利用率,保证用户体验同时也能提高性能,使得开发者能够更加专注功能实现和UI设计。那么如何利用Android Studio实现后台分离的选课系统呢? 首先,在后台服务器中实现选课系统的核心功能,包括选课、退课、查看成绩等等,同时提供API供移动客户端使用。其次,在Android Studio中,应该采用MVVM架构分层,将Activity、Fragment和ViewModel分别放在不同的层次。这样,可以实现Activity、Fragment和ViewModel之间的解耦,使得代码更加清晰。 在具体实现方面,可以利用Retrofit + RxJava来实现API接口的访问和处理,它们的组合可以快速实现对后台数据的异步请求和响应处理。同时,对于UI界面的设计,可以利用Google官方的Material Design组件库,以便从美感和视觉交互层面来提高用户体验。 其次,为了保证系统的安全性,需要采用OAuth2.0协议对客户端的API请求进行授权,与此同时,后台服务器还应该采用安全认证技术,例如HTTPS来保证数据的安全性。 总之,利用Android Studio实现后台分离的选课系统,需考虑多方面的因素,例如架构、API访问和安全性等等。如果参考上述的实现方法,开发者可以通过Android Studio轻松地实现这一目标。 ### 回答2: Android Studio是一个非常流行的开发工具,可以帮助开发者很方便地实现各种应用程序。而对于学生选课系统来说,我们可以借助Android Studio实现后台分离的架构。 在实现后台分离的选课系统中,我们需要通过Android Studio构建Web API服务器,让端和后端能够通过API接口进行数据交互。在开发的过程中,我们需要设计API接口,以及后端服务,分别负责处理数据请求和响应,并将接口和服务组织成一个Web API服务器。 在端开发中,我们使用React Native来实现UI界面和用户交互,React Native是一个流行的跨平台框架,它可以通过JavaScript语言编写UI代码,并把这些代码转化为原生代码来实现界面展示。在这种情况下,我们需要使用相关的React Native模块和工具来实现选课系统的端部分。 最后,我们可以将后台组合起来,让API接口能够将数据传递给端,实现选课系统的功能。在这个过程中,我们需要注意接口和数据的安全性,同时也需要考虑系统的性能和扩展性。 总之,我们可以通过Android Studio将后台分离的选课系统开发出来,这个过程需要我们对相关技术有一定的了解和掌握,并且需要注重代码的可维护性和性能。当然,这个选课系统只是一个简单的例子,实际上,我们可以通过Android Studio实现更加复杂和功能强大的应用程序。 ### 回答3: 在Android Studio中实现后台分离的选课系统,需要分别开发端和后端。端主要面向用户,包括用户的课程查询、选课、退课等操作,后端则负责处理端传递过来的数据并且进行数据存储、业务逻辑处理等操作。 端开发需要优先确定好UI设计,保证用户体验。采用现有的设计模板,可以提高开发效率。Android Studio提供了各种UI组件,开发者可以根据需求自由组合,展现出富有交互性、美观合理的UI。 在后端开发中,首先需要搭建数据库环境,设计好数据库表结构。利用MySQL或MySQLite等数据库方便进行数据的存储和管理。后端开发需要使用Web框架如Spring等,通过MVC模型实现数据的处理和返回,方便维护和升级。后端还需要实现一些必要的安全性、架构性、高可用性等功能,确保系统稳定性和数据的安全性。 在后端交互方面,我们可以采用RESTful API或WebSocket等技术实现数据传输和通讯。Android Studio为了提高开发效率,内置很多便携的第三方库如Simple HTTP Library、Volley等,这些库可以帮助我们实现后端数据传输和通讯等功能。 综合考虑上述各个方面,我们可以在Android Studio中实现后台分离的选课系统。通过前后端分离,可以使代码层面实现模块化,从而增强系统的可维护性、灵活性和扩展性,同时也分别满足了用户和开发者的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值