JWT Spring Boot starter

作者: zerouwar | 来源:发表于2017-08-19 00:13 被阅读492次


    自己弄的一个可自定义配置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

    相关文章

      网友评论

        本文标题:JWT Spring Boot starter

        本文链接:https://www.haomeiwen.com/subject/gdvzrxtx.html