JWT Spring Boot starter


自己弄的一个可自定义配置JWT的spring-boot-starter,方便在spring security中集成JWT认证。

使用

首先在你的spring boot项目的pom.xml添加我的github个人仓库

    <repositories>
        <repository>
            <id>chenhuanming-repo</id>
            <name>chenhuanming-repo</name>
            <url>https://raw.githubusercontent.com/zerouwar/my-maven-repo/master</url>
        </repository>
    </repositories>

然后添加jwt-spring-boot-starter依赖

    <dependency>
        <groupId>cn.chenhuanming</groupId>
        <artifactId>jwt-spring-boot-starter</artifactId>
        <version>0.0.2</version>
    </dependency>

这样已经集成了JWT认证。可以运行你的spring boot项目,用用户名和密码发出POST /login请求(spring security默认用户user,密码在启动日志可以获取),可以拿到一个带token的json

    {
        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwic2hvcnRFeHAiOjE1MDMwNjg4NDksImV4cCI6MTUwMzY3MzU4OSwiaWF0IjoxNTAzMDY4Nzg5LCJhdXRob3JpdGllcyI6IlJPTEVfVVNFUiJ9.s6iAIh52gyfrPWfLEPjasYZ7GNFt6Vwb0itLZ5De89I"
    }

这样就可以用这个token去访问受保护的api了(默认所有api都要求认证,后面会说怎么自定义配置),在这个例子里就像下面这样设置http header的Authorization

    Authorization=Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwic2hvcnRFeHAiOjE1MDMwNjg4NDksImV4cCI6MTUwMzY3MzU4OSwiaWF0IjoxNTAzMDY4Nzg5LCJhdXRob3JpdGllcyI6IlJPTEVfVVNFUiJ9.s6iAIh52gyfrPWfLEPjasYZ7GNFt6Vwb0itLZ5De89I

默认token有一个短期有效期(15分钟)和长期有效期(7天),如果token在长期有效期内,短期失效可以要求刷新token,服务端如果检查到token失效,会返回412状态码,并在response body返回一个带refreshToken的json。

自定义配置

很少情况需要用spring security那个随机密码,所以很多时候我们需要自定义UserDetailsService。只需要把自己实现的UserDetailsService注册为spring Beanjwt-spring-boot-starter会自动发现你写的UserDetailsService

其他支持自动发现的组件有:

  • TokenUtils 封装token操作的工具类
  • JWTSuccessHandler 验证用户和密码成功后调用的handler,继承了AuthenticationSuccessHandler
  • TokenAuthorizationFilter 拦截请求,进行JWT验证的Filter。
  • JWTAuthorizationManager 负责JWT验证工作的管理器。
  • TokenExpiredHandler token失效后的handler
  • TokenRefreshHandler token需要刷新的handler
  • TokenSuccessHandler token验证成功的handler
  • TokenInvalidHandler token不合法的handler

另外可以通过application.yml设置一些配置信息,如要改变默认的token短期有效期,可以设置utils.jwt.shortExp的值(分钟),更多配置信息可以看JWTProperties类。

最后,一般程序都会继承WebSecurityConfigurerAdapter来定义spring security的安全配置,引用了jwt-spring-boot-starter后,不能继承WebSecurityConfigurerAdapter,需要继承JWTSecurityAutoConfiguration(这个类继承了WebSecurityConfigurerAdapter),JWTSecurityAutoConfiguration只是包装了WebSecurityConfigurerAdapter,基本使用方法都跟原来一样,除了void configure(HttpSecurity http)方法不能直接重写(通过实现JWTSecurityAutoConfigurationvoid configureHttpSecurity(HttpSecurity http)钩子方法)。可以查看JWTSecurityAutoConfiguration的源码,大概就是这样:

    @Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and().addFilterBefore(tokenAuthorizationFilter, SecurityContextPersistenceFilter.class);
}

项目地址

项目托管在github

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容