文档章节

【spring cloud】自定义jwt实现spring cloud nosession

冷冷gg
 冷冷gg
发布于 2017/08/22 23:30
字数 374
阅读 2917
收藏 0

image

JWT实现在网关模块,网关的路由是默认配置。 jwt 生成、验证依赖

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.7.0</version>
</dependency>

最核心的配置是在spring security中加入我们token校验机制的fiter:JwtAuthenticationTokenFilter

protected void doFilterInternal(
    HttpServletRequest request,
    HttpServletResponse response,
    FilterChain chain) throws ServletException, IOException {
    String authHeader = request.getHeader(this.tokenHeader);
    if (authHeader != null && authHeader.startsWith(tokenHead)) {
        String authToken = authHeader.substring(tokenHead.length()); // The part after "Bearer "
        String username = jwtTokenUtil.getUsernameFromToken(authToken);
        logger.info("checking authentication " + username);

        if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
            UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);

            if (jwtTokenUtil.validateToken(authToken, userDetails)) {
                UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
                        userDetails, null, userDetails.getAuthorities());
                authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(
                        request));
                logger.info("authenticated user " + username + ", setting security context");
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        }
    }

    chain.doFilter(request, response);
}

在看我们的spring security 配置

protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
    // 由于使用的是JWT,我们这里不需要csrf
    .csrf().disable()

    .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()

    // 基于token,所以不需要session
    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()

    .authorizeRequests()
    //.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()

    // 允许对于网站静态资源的无授权访问
    .antMatchers(
            HttpMethod.GET,
            "/",
            "/*.html",
            "/favicon.ico",
            "/**/*.html",
            "/**/*.css",
            "/**/*.js"
    ).permitAll()
    .antMatchers("/auth/**").permitAll()
    .anyRequest().authenticated();
// 添加JWT filter
httpSecurity
        .addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);
// 禁用缓存
httpSecurity.headers().cacheControl();
}

获取token

POST 

http://localhost:8080/auth

Content-Type: application/json

{"username":"1234","password":"1234"}

---
结果

{
  "token" : "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxMjM0IiwiY3JlYXRlZCI6MTUwMzQxMzMwODkxOCwiZXhwIjoxNTA0MDE4MTA4fQ.jQc5MRdgKfi5ds1N0ZSsxkunQQVkFuGJ7Giv1_JrjTiKsu3h7UwE8vjU5wVPaipM_zkbHaMpRqXvF__ci5p7aw"
}

访问资源

GET

http://localhost:8080/user-service/bizUser/getUserScore

Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxMjM0IiwiY3JlYXRlZCI6MTUwMzQxMzMwODkxOCwiZXhwIjoxNTA0MDE4MTA4fQ.jQc5MRdgKfi5ds1N0ZSsxkunQQVkFuGJ7Giv1_JrjTiKsu3h7UwE8vjU5wVPaipM_zkbHaMpRqXvF__ci5p7aw

---
结果
[
  {
    "id": 11,
    "username": "123",
    "password": "456",
    "scoreList": [
      {
        "id": 1,
        "score": 100
      }
    ]
  }
]

不加认证token

{
  "timestamp": 1503413947608,
  "status": 401,
  "error": "Unauthorized",
  "message": "手动滑稽(  ´-ω ・)▄︻┻┳══━一",
  "path": "/user-service/bizUser/getUserScore"
}

参考https://github.com/wpcfan/spring-boot-tut

详细整合源码:springcloud-zuul-jwt 和 springboot-mybatis-plus

© 著作权归作者所有

共有 人打赏支持
冷冷gg
粉丝 428
博文 113
码字总数 52275
作品 1
潍坊
UI设计师
私信 提问
加载中

评论(9)

jamen
jamen

引用来自“jamen-chen”的评论

这里怎么判断一个 token对某个api是否有权限访问啊?

引用来自“冷冷gg”的评论

这个fiter 只对token 的合法判断,继续执行会执行你spring security 原有的 权限判断

引用来自“jamen”的评论

那么这个token 需要携带权限点信息吗? 这个token不是security产生的吧

引用来自“冷冷gg”的评论

token 里面是携带 。token 是包装的 security UserDetails,所以security UserDetails 里面的数据都有的

引用来自“jamen”的评论

那么在 api上 用 security的 注解就行?

引用来自“冷冷gg”的评论

嗯嗯
那么 在jwt 中携带 权限点, 如果是超级管理员,有200多个api 权限点, 那么这个token 会不会太大,这个在app流量中不好吧?
冷冷gg
冷冷gg

引用来自“如梦技术”的评论

厉害,我都没还没折腾这个呢!

���� 春哥忙,我最近事情不多 瞎搞
如梦技术
如梦技术
厉害,我都没还没折腾这个呢!
冷冷gg
冷冷gg

引用来自“jamen-chen”的评论

这里怎么判断一个 token对某个api是否有权限访问啊?

引用来自“冷冷gg”的评论

这个fiter 只对token 的合法判断,继续执行会执行你spring security 原有的 权限判断

引用来自“jamen”的评论

那么这个token 需要携带权限点信息吗? 这个token不是security产生的吧

引用来自“冷冷gg”的评论

token 里面是携带 。token 是包装的 security UserDetails,所以security UserDetails 里面的数据都有的

引用来自“jamen”的评论

那么在 api上 用 security的 注解就行?
嗯嗯
jamen
jamen

引用来自“jamen-chen”的评论

这里怎么判断一个 token对某个api是否有权限访问啊?

引用来自“冷冷gg”的评论

这个fiter 只对token 的合法判断,继续执行会执行你spring security 原有的 权限判断

引用来自“jamen”的评论

那么这个token 需要携带权限点信息吗? 这个token不是security产生的吧

引用来自“冷冷gg”的评论

token 里面是携带 。token 是包装的 security UserDetails,所以security UserDetails 里面的数据都有的
那么在 api上 用 security的 注解就行?
冷冷gg
冷冷gg

引用来自“jamen-chen”的评论

这里怎么判断一个 token对某个api是否有权限访问啊?

引用来自“冷冷gg”的评论

这个fiter 只对token 的合法判断,继续执行会执行你spring security 原有的 权限判断

引用来自“jamen”的评论

那么这个token 需要携带权限点信息吗? 这个token不是security产生的吧
token 里面是携带 。token 是包装的 security UserDetails,所以security UserDetails 里面的数据都有的
jamen
jamen

引用来自“jamen-chen”的评论

这里怎么判断一个 token对某个api是否有权限访问啊?

引用来自“冷冷gg”的评论

这个fiter 只对token 的合法判断,继续执行会执行你spring security 原有的 权限判断
那么这个token 需要携带权限点信息吗? 这个token不是security产生的吧
冷冷gg
冷冷gg

引用来自“jamen-chen”的评论

这里怎么判断一个 token对某个api是否有权限访问啊?
这个fiter 只对token 的合法判断,继续执行会执行你spring security 原有的 权限判断
j
jamen-chen
这里怎么判断一个 token对某个api是否有权限访问啊?
Spring boot 2.0 with Oauth2 + Jwt

Spring boot 2.0 with Oauth2 + Jwt 在这篇文章中: Netkiller Spring Cloud 手札 Spring Cloud Cookbook 本文节选自电子书《Netkiller Spring Cloud 手札》 本文出处:http://www.netkille......

netkiller-
09/04
0
0
JWT 在 Spring 上的实践

简介 手头的新项目采用 jwt 做客户端验证,而不再使用 cookie,确实方便很多,起码跨域这事不用考虑了。 jwt 是什么之类的就不多说了,这玩意的介绍满大街都是,这儿只是简单介绍下我在使用过...

郁也风
2017/10/26
0
7
springboot集成JWT,必须要使用spring security组件吗?

看到网上很多springboot集成JWT的demo,都使用了spring security组件, 想问下大牛们,spring security组件是JWT集成所必须的吗? 我只想单纯的springboot集成JWT,各位有例子参考不? 谢谢了...

jelly_oy
10/11
115
0
Spring boot 前后台分离项目 怎么处理spring security 抛出的异常

最近在开发一个项目 前后台分离的 使用 spring boot + spring security + jwt 实现用户登录权限控制等操作。但是 在用户登录的时候,怎么处理spring security 抛出的异常呢?使用了@RestCont...

developlee的潇洒人生
05/07
1K
3
SpringBoot--JWT集成配置

一, JWT简介 JWT 全名 JSON WEB Token 主要作用为用户身份验证, 广泛应用与前后端分离项目当中. JWT 的优缺点 : https://www.jianshu.com/p/af8360b83a9f 二, JWT 在 spring boot 项目当中的...

ge洋
05/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Flask框架web开发:零基础入门

Flask框架是Python开发的一个基于Werkzeug和Jinja 2的web开发微框架,它的优势就是极其简洁,但又非常灵活,而且容易学习和应用。因此Flask框架是Python新手快速开始web开发最好的选择,此外...

笔阁
5分钟前
0
0
VMware前路难测,多个厂家群雄逐鹿

在人们高谈Salesforce、亚马逊等新兴云计算厂商取得的成就时,以VMware、HPE和Cisco为代表的老牌厂商也在进行着自己的转型和变化,而且还取得一定的进展。以VMware为例,虚拟机巨头公布了第二...

linuxCool
8分钟前
0
0
什么是以太坊DAO?(一)

Decentralized Autonomous Organization,简称DAO,以太坊中重要的概念。一般翻译为去中心化的自治组织。 “在区块链上,没有人知道你是一台冰箱”——理查德布朗 到目前为止,我们列出的所有...

geek12345
9分钟前
0
0
linux防火墙操作

一、.对于centos7自带的防火墙的相关指令 #停止firewall systemctl stop firewalld.service #禁止firewall开机启动 systemctl disable firewalld.service #查看firewall的状态 systemctl st......

张锦飞
11分钟前
0
0
Linux 磁盘与磁盘分区

  Linux 系统中所有的硬件设备都是通过文件的方式来表现和使用的,我们将这些文件称为设备文件,硬盘对应的设备文件一般被称为块设备文件。本文介绍磁盘设备在 Linux 系统中的表示方法以及...

SEOwhywhy
21分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部