SpringCloud 大型系列课程正在制造中,欢迎我们关注与提意见。
程序员每天的CV 与 板砖,也要知其所以然,本系列课程能够帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发
本文章是系列文章中的一篇
- SpringCloud 整合Gateway服务网关 【SpringCloud系列5】
本文章实现效果如下:
- 输入用户名与暗码后,点击登录调用登录接口
- 登录成功后,获取到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 、英语相关的内容分享
本文正在参与「金石方案」