SpringCloud 业务管理后台 通过FeignClient来调用oauth/token接口【SpringCloud系列11】
SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见。 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发
本文章是系列文章中的一篇
本文章实现效果如下:
- 输入用户名与密码后,点击登录调用登录接口
- 登录成功后,获取到token ,再获取管理后台用户的菜单权限
1 在微服务项目中新增 admin-api 管理后台业务处理模块
关于创建基础的模块在 【1、SpringCloud 项目基础工程搭建 【SpringCloud系列1】】中有详细概述,在这里不做详细描述。
项目目录结构如下:
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 来调用
管理后台登录接口如下
@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 源码 gitee.com/android.lon… 本项目
- 管理后台web 源码gitee.com/android.lon…
- 如果有兴趣可以关注一下公众号 biglead ,每周都会有 java、Flutter、小程序、js 、英语相关的内容分享
转载自:https://juejin.cn/post/7214427834994425915