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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 从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

相关文章
|
4月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
78 4
|
21天前
|
监控 Java 应用服务中间件
SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析
Spring Boot 通过简化配置、自动配置和嵌入式服务器等特性,大大简化了 Spring 应用的开发过程。它通过提供一系列 `starter` 依赖和开箱即用的默认配置,使开发者能够更专注于业务逻辑而非繁琐的配置。Spring Boot 的自动配置机制和强大的 Actuator 功能进一步提升了开发效率和应用的可维护性。通过对其源码的分析,可以更深入地理解其内部工作机制,从而更好地利用其特性进行开发。
42 6
|
1月前
|
人工智能 Java API
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
本次分享的主题是阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手,由阿里云两位工程师分享。
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
|
2月前
|
人工智能 前端开发 Java
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
本文介绍了如何使用Spring AI Alibaba开发一个简单的AI对话应用。通过引入`spring-ai-alibaba-starter`依赖和配置API密钥,结合Spring Boot项目,只需几行代码即可实现与AI模型的交互。具体步骤包括创建Spring Boot项目、编写Controller处理对话请求以及前端页面展示对话内容。此外,文章还介绍了如何通过添加对话记忆功能,使AI能够理解上下文并进行连贯对话。最后,总结了Spring AI为Java开发者带来的便利,简化了AI应用的开发流程。
787 0
|
1月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
2月前
|
XML JSON Java
Spring Boot 开发中常见的错误
本文总结了 Java 开发中常见的几个问题及其改进方法,包括:1. 过度使用 `@Component` 注解;2. `@ResponseBody` 注解的错误用法;3. `@Autowired` 的不当使用;4. `application.properties` 管理不善;5. 异常处理不当。每部分详细解释了错误情况和建议的改进方案,并提供了相应的代码示例。
68 11
|
2月前
|
IDE Java 测试技术
互联网应用主流框架整合之Spring Boot开发
通过本文的介绍,我们详细探讨了Spring Boot开发的核心概念和实践方法,包括项目结构、数据访问层、服务层、控制层、配置管理、单元测试以及部署与运行。Spring Boot通过简化配置和强大的生态系统,使得互联网应用的开发更加高效和可靠。希望本文能够帮助开发者快速掌握Spring Boot,并在实际项目中灵活应用。
75 5
|
2月前
|
前端开发 Java 开发者
这款免费 IDEA 插件让你开发 Spring 程序更简单
Feign-Helper 是一款支持 Spring 框架的 IDEA 免费插件,提供 URL 快速搜索、Spring Web Controller 路径一键复制及 Feign 与 Controller 接口互相导航等功能,极大提升了开发效率。
|
3月前
|
前端开发 JavaScript Java
如何使用 Spring Boot 和 Angular 开发全栈应用程序:全面指南
如何使用 Spring Boot 和 Angular 开发全栈应用程序:全面指南
74 1
|
3月前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
79 2