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

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 从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

相关文章
|
2月前
|
JSON Java API
利用Spring Cloud Gateway Predicate优化微服务路由策略
Spring Cloud Gateway 的路由配置中,`predicates`​(断言)用于定义哪些请求应该匹配特定的路由规则。 断言是Gateway在进行路由时,根据具体的请求信息如请求路径、请求方法、请求参数等进行匹配的规则。当一个请求的信息符合断言设置的条件时,Gateway就会将该请求路由到对应的服务上。
156 69
利用Spring Cloud Gateway Predicate优化微服务路由策略
|
22天前
|
搜索推荐 NoSQL Java
微服务架构设计与实践:用Spring Cloud实现抖音的推荐系统
本文基于Spring Cloud实现了一个简化的抖音推荐系统,涵盖用户行为管理、视频资源管理、个性化推荐和实时数据处理四大核心功能。通过Eureka进行服务注册与发现,使用Feign实现服务间调用,并借助Redis缓存用户画像,Kafka传递用户行为数据。文章详细介绍了项目搭建、服务创建及配置过程,包括用户服务、视频服务、推荐服务和数据处理服务的开发步骤。最后,通过业务测试验证了系统的功能,并引入Resilience4j实现服务降级,确保系统在部分服务故障时仍能正常运行。此示例旨在帮助读者理解微服务架构的设计思路与实践方法。
69 16
|
2月前
|
XML Java 数据格式
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
本文介绍了在使用Spring框架时,如何通过创建`applicationContext.xml`配置文件来管理对象。首先,在resources目录下新建XML配置文件,并通过IDEA自动生成部分配置。为完善配置,特别是添加AOP支持,可以通过IDEA的Live Templates功能自定义XML模板。具体步骤包括:连续按两次Shift搜索Live Templates,配置模板内容,输入特定前缀(如spring)并按Tab键即可快速生成完整的Spring配置文件。这样可以大大提高开发效率,减少重复工作。
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
|
2月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
24天前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
2月前
|
Java Nacos Sentinel
Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。
343 13
Spring Cloud Alibaba:一站式微服务解决方案
|
2月前
|
Java 关系型数据库 Nacos
微服务SpringCloud链路追踪之Micrometer+Zipkin
SpringCloud+Openfeign远程调用,并用Mircrometer+Zipkin进行链路追踪
267 20
|
29天前
|
Java 关系型数据库 数据库
微服务SpringCloud分布式事务之Seata
SpringCloud+SpringCloudAlibaba的Seata实现分布式事务,步骤超详细,附带视频教程
49 1
|
2月前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
119 14
|
3月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
192 6