Java 整合JWT

1.1为什么学习JWT(引入)

        微服务集群中的每个服务,对外提供的都是Rest风格的接口,而Rest风格的一个最重要的规范就是:服务的无状态性

  • 需要解决问题:服务与服务之间可以确定用户的登录状态,甚至可以确定登录用户信息。
  • 解决方案:使用令牌

1.2 什么是JWT 

        JWT,全称是JSON Web Token,是JSON风格轻量级的授权和身份认证规范,可实现无状态、分布式的Web应用授权;官网:https://jwt.io

  • Token需要加密,进行保护,采用RSA加密

1.3 使用RSA工具

  • 生成公钥和私钥

1.3.1搭建环境

1)父项目(pom文件)

<jwt.jjwt.version>0.9.0</jwt.jjwt.version>
<jwt.joda.version>2.9.7</jwt.joda.version>
<beanutils.version>1.9.3</beanutils.version>


<!--jwt-->
<!--JavaBean工具类,用于JavaBean数据封装-->
<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>${beanutils.version}</version>
</dependency>
<!--jwt工具-->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>${jwt.jjwt.version}</version>
</dependency>
<!--joda 时间工具类 -->
<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>${jwt.joda.version}</version>
</dependency>

2)网关(pom文件)

 <!--jwt-->
        <!--JavaBean工具类,用于JavaBean数据封装-->
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
        </dependency>
        <!--jwt工具-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
        </dependency>
        <!--joda 时间工具类 -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
        </dependency>

1.3.2拷贝工具

1.3.3 测试

public class TestRSA {

    private static final String pubKeyPath = "D:\\rsa\\rsa.pub";

    private static final String priKeyPath = "D:\\rsa\\rsa.pri";


    @Test
    public void testGenerate() throws Exception {
        RsaUtils.generateKey(pubKeyPath, priKeyPath, "1234");
    }

    @Test
    public void testGet() throws Exception {
        PublicKey publicKey = RsaUtils.getPublicKey(pubKeyPath);
        System.out.println(publicKey);

        PrivateKey privateKey = RsaUtils.getPrivateKey(priKeyPath);
        System.out.println(privateKey);
    }


}

1.4 使用JWT工具

  • 生成Token
  • 解析Token
public class TestJwt {

    private static final String pubKeyPath = "D:\\rsa\\rsa.pub";

    private static final String priKeyPath = "D:\\rsa\\rsa.pri";

    @Test
    public void testCreateToken() throws Exception {
        //需要生成令牌的数据
        User loginUser = new User();
        loginUser.setUserName("jack");
        loginUser.setPassword("6666");
        loginUser.setGender(false);

        //生成token:数据,过期时间,私钥
        String token = JwtUtils.generateToken(loginUser, 1, RsaUtils.getPrivateKey(priKeyPath));
        System.out.println(token);
    }

    @Test
    public void testParseToken() throws Exception {
        String token = "eyJhbGciOiJSUzI1NiJ9.eyJjbGFzcyI6ImNvbS5jenh5LmRvbWFpbi5Vc2VyIiwiZ2VuZGVyIjpmYWxzZSwicGFzc3dvcmQiOiI2NjY2IiwidXNlck5hbWUiOiJqYWNrIiwiZXhwIjoxNzAyNTQxNjcxfQ.YSZq8gE3Urx3CPXqT07FyzPgy8IEQWWVYWoNDRR42ed27IBaDWrIYZ4paJRefHL1eEy_7CPvlRhEJBzfBrihZ9hme2rEhZp8PSro8UuYTb6_73y3JWDlLvWE0wyosrh-69Y37jADB8xXN4s9i8BU7EQVDjNHhfKUu5b6vXfZQSg";
        User loginUser = JwtUtils.getObjectFromToken(token, RsaUtils.getPublicKey(pubKeyPath), User.class);
        System.out.println(loginUser);
    }
}

1.5 配置yml

#自定义内容
sc:
  jwt:
    secret: sc@Login(Auth}*^31)&czxy% # 登录校验的密钥(自定义内容)
    pubKeyPath: D:/rsa/rsa.pub # 公钥地址
    priKeyPath: D:/rsa/rsa.pri # 私钥地址
    expire: 360 # 过期时间,单位分钟

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下步骤在Spring Boot中集成JWT: 1. 添加java-jwt依赖包到pom.xml文件中: ```xml <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.18.1</version> </dependency> ``` 2. 创建一个JWT工具类来生成和验证JWT令牌: ```java import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTVerificationException; import com.auth0.jwt.interfaces.DecodedJWT; import java.util.Date; public class JwtUtils { private static final long EXPIRATION_TIME = 86400000; // 24 hours private static final String SECRET = "mySecret"; private static final String ISSUER = "myIssuer"; public static String generateToken(String username) { Date now = new Date(); Date expiryDate = new Date(now.getTime() + EXPIRATION_TIME); return JWT.create() .withSubject(username) .withIssuer(ISSUER) .withIssuedAt(now) .withExpiresAt(expiryDate) .sign(Algorithm.HMAC512(SECRET)); } public static String getUsernameFromToken(String token) throws JWTVerificationException { DecodedJWT jwt = JWT.require(Algorithm.HMAC512(SECRET)) .withIssuer(ISSUER) .build() .verify(token); return jwt.getSubject(); } } ``` 3. 在Spring Security配置中添加JWT过滤器,以验证JWT令牌: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.http.HttpStatus; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.config.annotation.SecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.HttpStatusEntryPoint; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Configuration @Order(1) public class JwtConfig extends SecurityConfigurerAdapter<javax.servlet.Filter, HttpSecurity> { @Autowired private JwtAuthenticationProvider jwtAuthenticationProvider; @Override public void configure(HttpSecurity http) throws Exception { JwtAuthenticationFilter jwtAuthenticationFilter = new JwtAuthenticationFilter(); jwtAuthenticationFilter.setAuthenticationManager(http.getSharedObject(AuthenticationManager.class)); jwtAuthenticationFilter.setAuthenticationFailureHandler(new JwtAuthenticationFailureHandler()); http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); } private class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter { @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { String token = request.getHeader("Authorization"); if (token == null || !token.startsWith("Bearer ")) { throw new JwtAuthenticationException("Invalid JWT token"); } String username = JwtUtils.getUsernameFromToken(token.substring(7)); if (username == null) { throw new JwtAuthenticationException("Invalid JWT token"); } return jwtAuthenticationProvider.authenticate(new UsernamePasswordAuthenticationToken(username, "")); } @Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { super.successfulAuthentication(request, response, chain, authResult); chain.doFilter(request, response); } } private class JwtAuthenticationFailureHandler extends HttpStatusEntryPoint { @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { response.setStatus(HttpStatus.UNAUTHORIZED.value()); } } } ``` 4. 创建一个JwtAuthenticationProvider来验证用户名和密码: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Component; @Component public class JwtAuthenticationProvider implements AuthenticationProvider { @Autowired private UserDetailsService userDetailsService; @Autowired private PasswordEncoder passwordEncoder; @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { String username = authentication.getName(); String password = (String) authentication.getCredentials(); UserDetails userDetails = userDetailsService.loadUserByUsername(username); if (!passwordEncoder.matches(password, userDetails.getPassword())) { throw new JwtAuthenticationException("Invalid username or password"); } return new UsernamePasswordAuthenticationToken(username, password, userDetails.getAuthorities()); } @Override public boolean supports(Class<?> authentication) { return authentication.equals(UsernamePasswordAuthenticationToken.class); } } ``` 5. 在Spring Security配置中添加JwtConfig: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private JwtAuthenticationProvider jwtAuthenticationProvider; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(jwtAuthenticationProvider); } @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .antMatcher("/**") .authorizeRequests() .antMatchers("/login").permitAll() .anyRequest().authenticated() .and() .apply(new JwtConfig()); } } ``` 现在你就可以在Spring Boot应用程序中使用JWT进行身份验证了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值