从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(八)saas平台篇-解决不同租户针定制化开发问题(2) -挂载自定义登陆以及业务端完整代码

简介: 从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(八)saas平台篇-解决不同租户针定制化开发问题(2) -挂载自定义登陆以及业务端完整代码

本文承接上文《从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(八) (mini-cloud) saas平台篇-解决不同租户针定制化开发问题 -完整代码以及案例方案(1)》

1.png为什么要挂载用户自定义登陆端以及自定义业务端,上节已经说过一些原因,这节补充下,主要原因有以下几点:


1。屏蔽登陆得clientid 以及clientSecret,因为多租户情况下需要client信息才可以确认租户信息

2.自定义登陆封装个性化信息,不同租户也许需要登陆后外围包装一些自己业务端的业务信息

3.租户自己需要重写或者新增某些功能,自己的业务端与自定义前端联通开发自己一套微服务应用


如何自定义租户自定义登陆断和业务端


原登陆需要指定框架共通的登陆url,并且输入clientid,clientSecret和grantType ,如下图

1.png

用户自定义部分模型如下


1.png

创建一个租户id是1的租户项目,创建一个登陆部分的子工程,代码结构如下

1.png

nacos 新增mini-cloud-busi-tanent-1-login-dev.yml文件

1.png

代码明细,正常添加controller 层,service层 ,只不过登陆变为了这个工程代理访问原url


TanentLoginController.java

package com.minicloud.busi.login.controller;
import com.minicloud.busi.login.service.TanentLoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Optional;
@RestController
@RequestMapping("/tanent")
public class TanentLoginController {
    @Autowired
    private TanentLoginService tanentLoginService;
    @PostMapping("/login")
    public ResponseEntity tanentLogin(@RequestParam("username") String username, @RequestParam("password") String password) throws Exception {
        return ResponseEntity.of(Optional.of(tanentLoginService.login(username, password)));
    }
}

TanentLoginServiceImpl.java

@Service
public class TanentLoginServiceImpl implements TanentLoginService {
    @Autowired
    private DiscoveryClient discoveryClient;
    @Value("${tanent.login.scope}")
    private String scope;
    @Value("${tanent.login.grant_type}")
    private String grantType;
    @Value("${tanent.login.client_id}")
    private String clientId;
    @Value("${tanent.login.client_secret}")
    private String clientSecret;
    @Override
    public String login(String username, String password) throws Exception {
        List<ServiceInstance> serviceInstances =   discoveryClient.getInstances("mini-cloud-authentication-center");
        for(ServiceInstance serviceInstance:serviceInstances){
           String response =  login(username,password,serviceInstance);
           if(null != response){
               return response;
           }
        }
        throw new Exception("null auth instance could be used");
    }
    private String login(String username, String password, ServiceInstance serviceInstance) {
        try {
            String url = "http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/oauth/token";
            Map map = MapUtil.builder().
                    put("username",username).
                    put("password",password).
                    put("scope",scope).
                    put("grant_type",grantType).
                    put("client_id",clientId).
                    put("client_secret",clientSecret).build();
            HttpRequest httpRequest = HttpRequest.post(url).form(map);
            return httpRequest.execute().body();
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}

重点是这里,目的是转交请求到框架的认证中心/auth/oauth/token


第一个红框是为了从注册中心获取可用的认证中心实例

1.png

bootstrap-dev.yml

server:
  port: 7500
  tomcat:
    uri-encoding: UTF-8
    threads:
      max: 500
    max-connections: 10240
    accept-count: 500
spring:
  application:
    name: @artifactId@
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS_HOST:mini-cloud-resiger}:${NACOS_PORT:8848}
        metadata:
          version: wl
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        file-extension: yml
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
  profiles:
    active: @profiles.active@

集成完毕,启动,查看服务实例

1.png

1.png

现在租户1的用户登陆变成了如下登陆方式,租户1的登陆地址变为了如下地址,请求时也只需要输入账号密码

1.png

后续可以自己添加租户个性化部分业务工程,就完成了个性化部分,到目前为止,只有登陆部分,但还没有返回租户id的代码部分,下篇将介绍如何登陆后针对租户添加租户tenantId

相关文章
|
10月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1460 3
|
9月前
|
SQL Java 数据库连接
Spring Data JPA 技术深度解析与应用指南
本文档全面介绍 Spring Data JPA 的核心概念、技术原理和实际应用。作为 Spring 生态系统中数据访问层的关键组件,Spring Data JPA 极大简化了 Java 持久层开发。本文将深入探讨其架构设计、核心接口、查询派生机制、事务管理以及与 Spring 框架的集成方式,并通过实际示例展示如何高效地使用这一技术。本文档约1500字,适合有一定 Spring 和 JPA 基础的开发者阅读。
870 0
|
8月前
|
运维 小程序 数据可视化
小程序开发平台有哪些?SaaS小程序制作平台哪个好
小程序开发模式详解:自主开发、SaaS小程序制作平台与外包全对比 选择合适的小程序开发模式,是项目成功的基石。这三种模式在成本、周期、控制力和灵活性上各有千秋,适用于不同阶段和不同类型的企业。下面我们将逐一深入剖析。
737 9
|
8月前
SaaS自助建站平台有哪些?自助建站哪个好
网站建设途径丰富多样,选择时需综合考量自身的技术能力、预算情况、时间规划以及功能需求。
612 5
|
8月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
733 8
|
10月前
|
Java 应用服务中间件 开发者
Spring Boot 技术详解与应用实践
本文档旨在全面介绍 Spring Boot 这一广泛应用于现代企业级应用开发的框架。内容将涵盖 Spring Boot 的核心概念、核心特性、项目自动生成与结构解析、基础功能实现(如 RESTful API、数据访问)、配置管理以及最终的构建与部署。通过本文档,读者将能够理解 Spring Boot 如何简化 Spring 应用的初始搭建和开发过程,并掌握其基本使用方法。
740 2
|
10月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
10月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
1544 10
|
11月前
|
Java Linux 网络安全
Linux云端服务器上部署Spring Boot应用的教程。
此流程涉及Linux命令行操作、系统服务管理及网络安全知识,需要管理员权限以进行配置和服务管理。务必在一个测试环境中验证所有步骤,确保一切配置正确无误后,再将应用部署到生产环境中。也可以使用如Ansible、Chef等配置管理工具来自动化部署过程,提升效率和可靠性。
1063 13
|
11月前
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
815 2