Spring Boot整合JWT快速入门教程

目录

前言

1. 什么是JWT

2. JWT解决的问题

3. JWT原理 

4. 快速入门

1. jar包

2. JWT工具类

3. 自定义注解

4. 拦截器

5. controller层

6. 测试

6.1 直接访问

6.2 先登录,再访问

5. 总结


前言

        小编通过网上的资源,自学spring boot整合JWT,但发现网上的大部分资源对新手入门都不是太友好~。所以本着复杂问题简单化的思想,写了这篇快速入门的文章,即是个人的学习笔记,又是帮助大家入门的查考。如有错误之处,请大家指出。

1. 什么是JWT

        JWT全称是:json web token。它将用户信息加密到 token 里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证 token 的正确性,只要正确即通过验证

2. JWT解决的问题

        传统的web服务用户登录的原理是,服务器将相关的用户信息储存到session中,客户端则储存session_id。当客户端发送请求到服务器时,请求会带有session_id,服务器根据session_id,找到对应的session,然后获取里面的用户信息,最后进行比对,从而验证用户是否已经登录。

        但是这种解决方案只适用于只有一台服务器提供服务,无法便捷地适用于服务器群集或面向服务的跨域体系结构的项目。JWT正好可以弥补这个弊端。  

        简单的来说,JWT解决了跨域身份验证问题

3. JWT原理 

        服务器在验证完用户信息后,会生成一个记录登录信息的JSON数据,并发送到客户端。每当客户端发送请求时,都会带有这个JSON数据,服务器会根据这个JSON数据来识别用户。从而实现跨域身份验证问题。

4. 快速入门

1. jar包

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.10.3</version>
</dependency>

2. JWT工具类

public class JwtUtil {
    /**
     * 生命周期为5分钟,单位是毫秒
     */
    private static final long EXPIRE_TIME = 5 * 60 * 1000;
    /**
     * 密钥
     */
    private static final String SECR
  • 25
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Spring Boot集成Spring Security、JWT和OAuth2的示例代码: 1. 添加依赖 在pom.xml文件中添加以下依赖: ```xml <!-- Spring Security --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!-- Spring Security OAuth2 --> <dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> <version>2.3.7.RELEASE</version> </dependency> <!-- JWT --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> ``` 2. 配置Spring Security 在Spring Boot应用程序中,可以通过配置类来配置Spring Security。创建一个配置类,命名为SecurityConfig.java,并添加以下内容: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Autowired private PasswordEncoder passwordEncoder; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder); } @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests().antMatchers("/oauth/**").permitAll() .anyRequest().authenticated() .and().formLogin().permitAll(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } } ``` 这个类配置了Spring Security,启用了Web安全性,并定义了一个UserDetailsService实例,该实例将用于验证用户。 3. 配置OAuth2 创建一个OAuth2配置类,命名为OAuth2Config.java,并添加以下内容: ```java @Configuration @EnableAuthorizationServer public class OAuth2Config extends AuthorizationServerConfigurerAdapter { @Autowired private AuthenticationManager authenticationManager; @Autowired private UserDetailsService userDetailsService; @Autowired private DataSource dataSource; @Autowired private PasswordEncoder passwordEncoder; @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.jdbc(dataSource); } @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints.authenticationManager(authenticationManager) .userDetailsService(userDetailsService) .accessTokenConverter(accessTokenConverter()); } @Bean public TokenStore tokenStore() { return new JdbcTokenStore(dataSource); } @Bean public JwtAccessTokenConverter accessTokenConverter() { JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); converter.setSigningKey("secret"); return converter; } @Override public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception { oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()"); } @Bean public ClientDetailsService clientDetailsService() { return new JdbcClientDetailsService(dataSource); } @Bean public ApprovalStore approvalStore() { return new JdbcApprovalStore(dataSource); } } ``` 这个类配置了OAuth2服务端,启用了授权服务器,并定义了一个客户端详情服务实例,该实例将用于管理客户端的详细信息。它还定义了一个令牌存储实例,该实例将用于存储访问令牌。 4. 配置JWT 创建一个JWT配置类,命名为JwtConfig.java,并添加以下内容: ```java @Configuration public class JwtConfig { @Value("${jwt.secret}") private String secret; @Bean public Key key() { return Keys.hmacShaKeyFor(secret.getBytes()); } @Bean public JwtDecoder jwtDecoder() { return NimbusJwtDecoder.withSecretKey(key()).build(); } @Bean public JwtEncoder jwtEncoder() { return NimbusJwtEncoder.withSecretKey(key()).build(); } } ``` 这个类配置了JWT,定义了一个秘钥,该秘钥将用于签署和验证JWT令牌。 5. 配置资源服务器 创建一个资源服务器配置类,命名为ResourceServerConfig.java,并添加以下内容: ```java @Configuration @EnableResourceServer public class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Autowired private JwtAccessTokenConverter accessTokenConverter; @Override public void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/api/**").authenticated() .anyRequest().permitAll(); } @Override public void configure(ResourceServerSecurityConfigurer resources) throws Exception { resources.tokenStore(tokenStore()).accessTokenConverter(accessTokenConverter); } @Bean public TokenStore tokenStore() { return new JwtTokenStore(accessTokenConverter); } } ``` 这个类配置了资源服务器,启用了资源服务器,并定义了一个令牌存储实例,该实例将用于存储访问令牌。 6. 创建实体类 创建一个User实体类,命名为User.java,并添加以下内容: ```java @Entity @Table(name = "users") public class User implements UserDetails { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(unique = true) private String username; private String password; @ElementCollection(fetch = FetchType.EAGER) private List<String> roles; @Override public Collection<? extends GrantedAuthority> getAuthorities() { return roles.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList()); } @Override public String getPassword() { return password; } @Override public String getUsername() { return username; } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; } } ``` 这个类定义了一个用户实体,实现了UserDetails接口,该接口提供了有关用户的详细信息。 7. 创建数据访问对象 创建一个UserRepository接口,命名为UserRepository.java,并继承JpaRepository接口,添加以下内容: ```java @Repository public interface UserRepository extends JpaRepository<User, Long> { Optional<User> findByUsername(String username); } ``` 这个接口定义了一个用户数据访问对象,用于管理用户。 8. 实现用户服务 创建一个UserServiceImpl类,命名为UserServiceImpl.java,并添加以下内容: ```java @Service public class UserServiceImpl implements UserDetailsService { @Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { return userRepository.findByUsername(username) .orElseThrow(() -> new UsernameNotFoundException("User not found")); } } ``` 这个类实现了UserDetailsService接口,该接口提供了一个方法,根据用户名加载用户信息。 9. 创建控制器 创建一个UserController类,命名为UserController.java,并添加以下内容: ```java @RestController @RequestMapping("/api") public class UserController { @GetMapping("/users") public List<User> getUsers() { return userRepository.findAll(); } @PostMapping("/users") public User createUser(@RequestBody User user) { user.setPassword(passwordEncoder.encode(user.getPassword())); return userRepository.save(user); } @Autowired private UserRepository userRepository; @Autowired private PasswordEncoder passwordEncoder; } ``` 这个类定义了一个RESTful API控制器,用于管理用户。 10. 测试 启动应用程序,并使用Postman测试API接口。例如,使用POST方法向/api/users端点发送请求,创建一个新用户。 这就是Spring Boot集成Spring Security、JWT和OAuth2的示例代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值