Spring Boot+Spring Security+Spring Social项目开发(七):使用JWT替换默认Token、JWT实现SSO单点登录

匿名 (未验证) 提交于 2019-12-03 00:22:01

  • 基本的Token参数配置(代码中的解释很详细)
    • 配置认证服务器TiHomAuthorizationServerConfig
    • core中创建类OAuth2Properties和OAuth2ClientProperties,OAuth2Properties用来管理OAuth2ClientProperties对象,也就是多个第三方应用的client管理;OAuth2ClientProperties是对单个client属性的配置
    • 把OAuth2Properties添加到SecurityProperties中
    • 去application.properties中配置

      tihom.security.oauth2.clients[0].clientId=tihom
      tihom.security.oauth2.clients[0].clientSecret=tihomsecret
      tihom.security.oauth2.clients[0].accessTokenValiditySeconds=3600
      tihom.security.oauth2.clients[1].clientId=test
      tihom.security.oauth2.clients[1].clientSecret=test
      #tihom.security.oauth2.clients[1].accessTokenValiditySeconds=(默认为0)
    • 把securityProperties注入到我们的认证服务器里面去
    • 配置令牌的存储:使用redis,令牌访问频繁,而且不需要去维护数据库表,性能比数据库好
    • 定义一个TokenStoreConfig类,这个类的作用就是从连接工厂拿到redis的连接,然后连到redis服务器上,如果产生token,就会存到指定的redis中
  • 使用JWT替换默认的Token
    • JWT(Json Web Token)
    • 1.自包含
      原本的token形式依赖存储,如果存储挂掉了令牌就毫无用处了,因为token本身是没有信息的;而JWT则本身带有信息,拿到令牌后直接解析令牌包含的信息,而不用去存储里面读信息.
    • 2.密签
      发出去的令牌可以使用指定的秘钥进行签名,签名不等于加密,只是防止别人去篡改信息,别人篡改我们可以知道,是一个开放的标准,对外界透明的,所以不要把敏感信息放在JWT中
    • 3.可扩展
    • 开发流程(代码中解释很详细)
    • 在TokenStoreConfig中添加一个静态类JwtTokenConfig
    • 将密钥写入OAuth2Properties中
    • 在认证服务器中加入

      @Autowired(required = false)
      private JwtAccessTokenConverter jwtAccessTokenConverter;

      并且在configure中做判断
    • 将demo中的UserController中”/me”的传入参数改为(Authentication user)
    • 在TokenStoreConfig的静态类JwtTokenConfig中添加

      /**
      <ul><li>token增强器
      */
      @Bean
      @ConditionalOnMissingBean(name = "jwtTokenEnhancer")
      //在不同系统里面可能处理是不同的,这里只是提供默认的,系统可以通过自己加入一个叫jwtTokenEnhancer的bean覆盖掉这个默认的逻辑
      public TokenEnhancer jwtTokenEnhancer(){
      return new TiHomJwtTokenEnhancer();
      }
  • 写TokenEnhancer增强器的实现方法TiHomJwtTokenEnhancer
  • 在认证服务器中加上

    @Autowired(required = false)
    private TokenEnhancer jwtTokenEnhancer;

    同时在configure中的判断做处理
  • (Authentication user)不知道你的自定义信息是什么的,如果要知道的话就需要自己写代码实现,先加依赖,在demo的pom中加

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

    将(Authentication user)改为(Authentication user,HttpServletRequest request)

    @GetMapping("/me")
    public Object getCurrentUser(Authentication user/* Authentication authentication*/,HttpServletRequest request)
    throws Exception {
    //获取请求头里面Authentication的值
    String header = request.getHeader("Authentication");
    String token = StringUtils.substringAfter(header,"bearer ");
    //JWT的解析器,把jwtToken转化成了claims对象
    Claims claims = Jwts.parser().setSigningKey(securityProperties.getOauth2().getJwtSigningKey().getBytes("UTF-8"))
    .parseClaimsJws(token).getBody();
    String company = (String) claims.get("company");
    //要用日志工具,不要用sout
    System.out.println("-->"+company);
    return user;
    }
  • 令牌的刷新
    • 令牌的时间在设置的失效时间后access_token就会失效了
    • 令牌失效后当我们再去获取令牌的时候同时发一个refresh_token给它,refresh_token在用户无感知的情况下去刷新令牌,得到一个新的access_token
    • refreshToken的失效时间在认证服务器中配置一下
  • 扩展和解析JWT的信息
  • 今晚继续更新。。。

    标签
    易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
    该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!