SpringCloud 大型系列课程正在制造中,欢迎我们关注与提意见。
程序员每天的CV 与 板砖,也要知其所以然,本系列课程能够帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发

本文章是系列文章中的一篇

  • SpringCloud 整合Gateway服务网关 【SpringCloud系列5】

本文章实现效果如下:

  • 输入用户名与暗码后,点击登录调用登录接口
  • 登录成功后,获取到token ,再获取办理后台用户的菜单权限
    SpringCloud 业务管理后台 通过FeignClient来调用oauth/token接口【SpringCloud系列11】

1 在微服务项目中新增 admin-api 办理后台业务处理模块

关于创立根底的模块在 【1、SpringCloud 项目根底工程搭建 【SpringCloud系列1】】中有具体概述,在这里不做具体描绘。 项目目录结构如下:

SpringCloud 业务管理后台 通过FeignClient来调用oauth/token接口【SpringCloud系列11】
AdminApplication 启动类装备:

  • 使用到了远程调用认证服务获取token,所以添加 Feign扫描包路径,本项目 Feign 统一办理在 feign-api 项目中
  • @MapperScan 是使用到mybatis-plus来操作数据库
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
@EnableFeignClients(basePackages = "com.biglead.feign.clients")
@SpringBootApplication
@MapperScan(basePackages = "com.biglead.admin.mapper")
public class AdminApplication {
	public static void main(String[] args) {
		SpringApplication.run(AdminApplication.class, args);
	}
	/**
	 * 分页插件
	 */
	@Bean
	public MybatisPlusInterceptor mybatisPlusInterceptor() {
		MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
		interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
		return interceptor;
	}
}

2 办理后台登录接口

  • web办理后台调用的接口都通过网关
  • 调用认证服务,通过服务内部 FeignClient 来调用
    SpringCloud 业务管理后台 通过FeignClient来调用oauth/token接口【SpringCloud系列11】
    办理后台登录接口如下
@Controller
@Slf4j
@RequestMapping("/admin")
public class AdminAuthController {
    @Autowired
    private FeignAuthClient feignAuthClient;
    /**
     * 登录今后返回token
     * @return
     */
    @PostMapping(value = "/login")
    @ResponseBody
    public CommonResult login(@Validated @RequestBody AdminAuthParam authParam) {
        String username = authParam.getUsername();
        String password = authParam.getPassword();
        if(StringUtils.isEmpty(username)||StringUtils.isEmpty(password)){
            return CommonResult.failed("请输入用户名和暗码");
        }
        MultiValueMap<String,String> headers = new LinkedMultiValueMap<>();
        headers.add("Content-Type","multipart/form-data");
        headers.add("Authorization","Basic WGNXZWJBcHA6WGNXZWJBcHA=");
        MultiValueMap<String,String> body = new LinkedMultiValueMap<>();
        body.add("username",username);
        body.add("password",password);
        body.add("grant_type","password");
        body.add("scope","all");
        //服务内部调用 认证服务
        Map<String,Object>  map = feignAuthClient.generateToken(body);
        log.info("获取token成功 {}",map);
        Map<String, Object> tokenMap = new HashMap<>();
        tokenMap.put("token", map.get("access_token"));
        tokenMap.put("tokenHead", "");
        return CommonResult.success(tokenMap);
    }
    @ApiOperation(value = "登出功用")
    @PostMapping(value = "/logout")
    @ResponseBody
    public CommonResult logout() {
        return CommonResult.success(null);
    }
}

在这里通过 FeignAuthClient 来调用 oauth/token 内部接口获取登录认证令牌,FeignAuthClient界说在 feign-api中

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@FeignClient("auth-api")
public interface FeignAuthClient {
    @PostMapping("/oauth/token")
    Object postAccessToken(@RequestParam MultiValueMap<String, String> parameters, 
                           @RequestHeader MultiValueMap<String, String> headers);
    @RequestMapping(method = RequestMethod.POST, value = "/oauth/token", headers = {"Content-Type: multipart/form-data", "Authorization=Basic WGNXZWJBcHA6WGNXZWJBcHA="})
    Map<String,Object> generateToken(@RequestBody MultiValueMap<String, String> map);
}

我这里边界说了两种写法,也是对应的不同的 headers 设置方法

3 办理后台获取登录用户的菜单权限

办理后台在调用 login 登录接口获取到 token 后,携带 token 来访问 user/info 接口,获取用户的权限与菜单列表

SpringCloud 业务管理后台 通过FeignClient来调用oauth/token接口【SpringCloud系列11】
办理后台装备的一级二级菜单
SpringCloud 业务管理后台 通过FeignClient来调用oauth/token接口【SpringCloud系列11】
然后能够创立人物,每个人物能够绑定不同的菜单
SpringCloud 业务管理后台 通过FeignClient来调用oauth/token接口【SpringCloud系列11】
然后每个用户能够分配不同的人物
SpringCloud 业务管理后台 通过FeignClient来调用oauth/token接口【SpringCloud系列11】

  • 本项目 SpringCloud 源码 gitee.com/android.lon… 本项目
  • 办理后台web 源码gitee.com/android.lon…
  • 如果有兴趣能够关注一下大众号 biglead ,每周都会有 java、Flutter、小程序、js 、英语相关的内容分享

本文正在参与「金石方案」