SpringCloud 业务管理后台 通过FeignClient来调用oauth/token接口【SpringCloud系列11】
  TEZNKK3IfmPf 2023年11月13日 67 0

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

本文章实现效果如下:

  • 输入用户名与密码后,点击登录调用登录接口
  • 登录成功后,获取到token ,再获取管理后台用户的菜单权限

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】

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   19天前   43   0   0 java
  TEZNKK3IfmPf   2024年05月31日   54   0   0 java
TEZNKK3IfmPf