项目学习第六天JWT微服务鉴权
2020-05-10 04:20
1416 查看
项目学习第六天 JWT微服务鉴权
什么是JWT
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用 户和服务器之间传递安全可靠的信息。
一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。
JWT工具类编写
common工程引入依赖
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.6.0</version> </dependency>
common工程,创建util.JwtUtil
package util; import io.jsonwebtoken.Claims; import io.jsonwebtoken.JwtBuilder; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Date; /** * Created by Administrator on 2018/4/11. */ @Component @ConfigurationProperties("jwt.config") public class JwtUtil { private String key ; private long ttl ;//一个小时 public String getKey() { return key; } public void setKey(String key) { this.key = key; } public long getTtl() { return ttl; } public void setTtl(long ttl) { this.ttl = ttl; } /** * 生成JWT * * @param id * @param subject * @return */ public String createJWT(String id, String subject, String roles) { long nowMillis = System.currentTimeMillis(); Date now = new Date(nowMillis); JwtBuilder builder = Jwts.builder().setId(id) .setSubject(subject) .setIssuedAt(now) .signWith(SignatureAlgorithm.HS256, key).claim("roles", roles); if (ttl > 0) { builder.setExpiration( new Date( nowMillis + ttl)); } return builder.compact(); } /** * 解析JWT * @param jwtStr * @return */ public Claims parseJWT(String jwtStr){ return Jwts.parser() .setSigningKey(key) .parseClaimsJws(jwtStr) .getBody(); } }
添加配置到要引用JwtUtil工具类工程的application.yml
jwt: config: key: shenhaiyu ttl: 360000
配置bean 修改对应工程Application类
@Bean public JwtUtil jwtUtil(){ return new util.JwtUtil(); }
修改AdminController的login方法
@Autowired private JwtUtil jwtUtil; @RequestMapping(value="/login",method = RequestMethod.POST) public Result login(@RequestBody Admin admin){ Admin adminLogin= adminService.login(admin); if(adminLogin==null){ return new Result(false,StatusCode.ERROR,"登录失败"); } //采取使前后端可以通话,利用JWT String token=jwtUtil.createJWT(adminLogin.getId(),adminLogin.getLoginname(),"admin"); Map<String,Object> map=new HashMap<>(); map.put("token",token); map.put("role","admin"); return new Result(true,StatusCode.OK,"登陆成功",map); }
测试运行结果
{ "flag": true, "code": 20000, "message": "登陆成功", "data": { "token": "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI5ODQzMjc1MDc4ODI5MzgzNjgiLCJzdWIiOiJ4aWF vbWkiLCJpYXQiOjE1MjM1MjQxNTksInJvbGVzIjoiYWRtaW4iLCJleHAiOjE1MjM1MjQ1MTl9 ._YF3oftRNTbq9WCD8Jg1tqcez3cSWoQiDIxMuPmp73o", "name":"admin" } }
JWT常见面试题
JWT 安全吗?
Base64编码方式是可逆的,也就是透过编码后发放的Token内容是可以被解析的。一般而言,我们都不建议在有效载荷内放敏感讯息,比如使用者的密码。
Token失效问题?
1、无状态JWT令牌(Stateless JWT Token)发放出去之后,不能通过服务器端让令牌失效,必须等到过期时间过才会失去效用。2、假设在这之间Token被拦截,或者有权限管理身份的差异造成授权Scope修改,都不能阻止发出去的Token失效并要求使用者重新请求新的Token。
如何完成权限校验的?
有权限管理的服务,管理用户的各种权限,及可访问路径等,在网关zuul中利用Pre过滤器,拦截一切请求,在过滤器中,解析jwt,获取用户身份,查询用户权限,判断用户身份可以访问当前路径。
服务端微服务地址不小心暴露了,用户就可以绕过网关,直接访问微服务,怎么办?
答:
我们的微服务在网关的后面,而且整个服务被Nginx反向代理微服务暴露的可能性低。我们的微服务都做了严格的服务间鉴权处理,任何对微服务的访问都会被验证是否有授权,如果没有则会被拦截。
相关文章推荐
- Spring Cloud与微服务学习总结(5)——认证鉴权与API权限控制在微服务架构中的设计与实现(三)
- paascloud开源项目学习(3) -- 服务注册到 zookeeper 中心过程分析
- Quartz.NET 2.0 学习笔记(5) :实例创建Windows服务实现任务调度 Quartz.NET 项目地址 http://quartznet.sourceforge.net/ Quar
- spring cloud jwt用户鉴权及服务鉴权
- 二、SpringCloud学习 之 服务发现组件Eureka项目创建
- ReactNative学习第六天 项目底部TabBar和Icon自定义库
- Spring Cloud与微服务学习总结(6)——认证鉴权与API权限控制在微服务架构中的设计与实现(四)
- springcloud学习之路一:项目建立与服务注册中心
- 微服务学习笔记系列-Spring Cloud优质项目推荐
- 项目管理学习笔记二:信息系统服务管理
- 学习 VS6.0 Win32 Application 创建服务程序解决实际项目问题之:SERVICE_STATUS
- Spring Cloud Gateway——(三)微服务网关实现JWT鉴权
- 项目管理学习笔记二:信息系统服务管理
- 备战秋招——记录自己学习的第六天(Django项目难点拆分——利用form定制实现用户验证)
- 项目管理学习笔记二:信息系统服务管理 推荐
- paascloud开源项目学习(1) -- 用户邮箱注册可靠消息服务流程
- Spring Cloud微服务接口鉴权(利用JWT生成的TOKEN)
- 项目管理学习笔记二:信息系统服务管理
- 项目管理学习笔记二:信息系统服务管理
- swift学习第六天 项目实战-知乎日报客户端(二)界面开发UITableView