• SpringBoot如何实现前后端分离统一认证与授权?


    
    前言:
        1.公司有多个项目组,每个项目组做不同的系统(应用),每个应用都相当于oauth中的一个client
        2.登陆页面项目组可以根据自己的风格设计登陆页,但都访问同一个登陆接口
        3.用户登陆获取到的token与应用token需要分开(用户有的权限应用不一定有,应用有的权限用户不一定有)
    
    需求:
        1.登陆:
            1.1:用户访问某一个系统界面时判断是否携带有效token,没有则跳转至登陆界面,url上拼接登陆成功的跳转地址及client_id(这里与oauth2客户端模式不同不需要携带client_secret)
            1.2:登陆常规校验及同时校验client_id是否与请求来源的域名匹配
            1.3:登陆成功则记录当前用户是通过那个系统登陆的
        2.服务端认证
            2.1:因每个项目组的应用都会提供一些开放接口给其他项目组使用。如【OA服务】需要向【考勤服务】查询数据,则需使用【OA服务】的client_id和client_secret生成token进行访问且需要校验是否有权限去访问【考勤服务】
    
    疑问点:
        1.用户访问界面时,是否是由服务端的判断没有token则重定向登陆页面,还是返回状态码由前端跳转至登陆界面。 这两种情况如何把client_id给到前端让其登陆时传给服务端
        2.只使用spring security能否实现以上需要,还是需要接入spring authorization server等框架。
        3.但接入spring authorization server框架在登陆时是否可以不传client_secret
    
    好晕。。。
    
    • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-29 10:54
      关注

      引自免费微信小程序:皆我百晓生

      要解决这个问题,我们可以采用OAuth2协议来实现前后端分离的统一认证与授权。OAuth2是一种基于Web的标准协议,用于安全地传输凭据、令牌和权限信息。以下是实现前后端分离登录与服务端认证的步骤:

      步骤 1: 安装OAuth2依赖库

      首先,你需要安装必要的OAuth2依赖库,例如spring-boot-starter-oauth2-client(如果你使用的是Spring Boot 4.0及以上版本)。

      mvn install -DgroupId=com.example -DartifactId=oauth2-sample -Dpackaging=jar
      

      步骤 2: 创建OAuth2 Client

      创建一个OAuth2客户端,并配置相应的参数,以便后续调用OpenID Connect服务器并获取授权。

      public class OAuthClient {
          private static final String CLIENT_ID = "your_client_id";
          private static final String CLIENT_SECRET = "your_client_secret";
          private static final String AUTHORIZATION_ENDPOINT = "https://example.com/oauth/authorize";
          private static final String TOKEN_ENDPOINT = "https://example.com/oauth/token";
      
          public void authenticate(String redirectUri) {
              // 配置OpenID Connect server URL
              String idTokenEndpoint = "https://id.example.com/id_token";
              
              // 获取授权URL
              String authorizeUrl = generateAuthorizeUrl(AUTHORIZATION_ENDPOINT);
              
              // 让用户提供凭证
              String usernameOrEmail = promptForUsername();
              String password = promptForPassword();
      
              // 发送POST请求获取令牌
              String accessToken = getToken(usernameOrEmail, password);
      
              // 校验访问令牌的有效性
              if (isAccessTokenValid(accessToken)) {
                  // 登录成功,获取用户信息
                  String user = getUserInfo(usernameOrEmail);
                  
                  // 跳转到指定的页面
                  redirectUserToPage(user, redirectUri);
              } else {
                  System.out.println("Invalid access token.");
              }
          }
      
          private String generateAuthorizeUrl(String endpoint) {
              return "https://example.com/oauth/authorize?response_type=code&client_id=" + CLIENT_ID + "&redirect_uri=" + redirectUri + "&scope=read+write";
          }
      
          private String getToken(String usernameOrEmail, String password) throws Exception {
              // 使用用户名密码登录
              return postRequest(TOKEN_ENDPOINT, "{\"username\": \"" + usernameOrEmail + "\", \"password\": \"" + password + "\"}");
          }
      
          private boolean isAccessTokenValid(String accessToken) {
              // 实现逻辑来验证access token的有效性
              return true;
          }
      
          private String promptForUsername() {
              // 提示用户输入用户名
              return "";
          }
      
          private String promptForPassword() {
              // 提示用户输入密码
              return "";
          }
      
          private String getUserInfo(String usernameOrEmail) throws Exception {
              // 使用用户名或邮箱获取用户信息
              return "";
          }
      
          private void redirectUserToPage(String user, String redirectUri) {
              // 将用户信息传递给后端,然后跳转到指定页面
              // 注意:此处未包含实际后的端操作
          }
      }
      

      步骤 3: 配置OAuth2 Server

      确保你的OAuth2服务器已正确配置,并允许从外部应用程序获取授权和访问令牌。

      步骤 4: 在前端处理登录流程

      在前端,你需要为每个登录页面添加相应的逻辑来处理用户的登录请求。这可能包括发送HTTP POST请求到指定的路径,并将所需的参数(如客户ID、授权码以及用户凭据)作为请求体的一部分。

      总结

      通过上述步骤,你可以在Spring Boot项目中实现前后端分离的统一认证与授权。这种方式使得每个项目组都可以根据自身的需求定制登陆页面的设计,同时也保证了安全性,因为只有经过授权的用户才能访问特定的服务。这个过程涉及到对OAuth2协议的理解和运用,因此理解整个流程可能会有一定的挑战。

      展开全部

    • 相关阅读:
      PCL 判断点位于球内外侧
      es6---模块化
      【图画】【终身学习】
      IDEA 2022最新版 基于 JVM极致优化 IDEA 启动速度
      11-DMA控制器
      【TA-霜狼_may-《百人计划》】图形2.7.2 GPU硬件架构概述
      基于BP神经网络的多因素房屋价格预测matlab仿真
      [项目管理-12]:项目经理的困惑:项目管理的常见难题及解决对策
      golang编译器提示Exported method with the unexported return type(公开、私有类型的用途)
      bootstrap 布局大屏,pc,小屏,移动屏自适应
    • 原文地址:https://ask.csdn.net/questions/8125265