jwt加springsercurity在erp项目中登入退出的流程
时间: 2024-03-26 12:37:07 浏览: 14
在使用JWT和Spring Security实现ERP项目的登录和退出流程时,一般分为以下几个步骤:
1. 用户登录:用户在客户端输入登录信息,客户端将登录信息发送到服务端进行认证。服务端认证成功后,生成JWT token并返回给客户端。
2. 客户端存储token:客户端接收到JWT token后,将其存储在本地,一般采用cookie或localStorage进行存储。
3. 访问受保护资源:当用户访问受保护的资源时,客户端将JWT token通过请求头或参数的形式发送到服务端。
4. 服务端认证:服务端接收到请求后,解析JWT token并进行认证。如果认证成功,则返回请求的资源;如果认证失败,则返回错误信息。
5. 用户退出:用户在客户端进行退出操作时,客户端将存储的JWT token删除。服务端无需进行任何操作,因为JWT token是无状态的,即服务端不保存任何会话信息。
在实现过程中,可以通过Spring Security提供的类和注解来实现认证和授权操作,例如使用@PreAuthorize注解来进行权限控制,使用UserDetailsService来实现用户详情查询等。同时,在生成JWT token时,需要使用密钥对token进行签名,保证token的安全性。
相关问题
springboot整合springSercurity登入逻辑退出逻辑代码以及认证授权代码代码
1. 登录逻辑代码:
```
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomUserDetailsService userDetailsService;
@Autowired
private JwtAuthenticationEntryPoint unauthorizedHandler;
@Bean
public JwtAuthenticationFilter authenticationTokenFilterBean() throws Exception {
return new JwtAuthenticationFilter();
}
@Override
public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
authenticationManagerBuilder
.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoder());
}
@Bean(BeanIds.AUTHENTICATION_MANAGER)
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors()
.and()
.csrf()
.disable()
.exceptionHandling()
.authenticationEntryPoint(unauthorizedHandler)
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/api/auth/**")
.permitAll()
.anyRequest()
.authenticated();
// 添加JWT filter
http.addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);
}
}
```
2. 认证授权代码:
```
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
@Transactional
public UserDetails loadUserByUsername(String usernameOrEmail)
throws UsernameNotFoundException {
// 查找用户
User user = userRepository.findByUsernameOrEmail(usernameOrEmail, usernameOrEmail)
.orElseThrow(() ->
new UsernameNotFoundException("User not found with username or email : " + usernameOrEmail)
);
// 返回用户详情
return UserPrincipal.create(user);
}
@Transactional
public UserDetails loadUserById(Long id) {
// 查找用户
User user = userRepository.findById(id).orElseThrow(
() -> new ResourceNotFoundException("User", "id", id)
);
// 返回用户详情
return UserPrincipal.create(user);
}
}
```
3. 退出逻辑代码:
```
@RestController
@RequestMapping("/api/auth")
public class AuthController {
@Autowired
private JwtTokenProvider tokenProvider;
@Autowired
private HttpServletRequest request;
@PostMapping("/logout")
public ResponseEntity<?> logout() {
// 清除本地的认证信息
SecurityContextHolder.getContext().setAuthentication(null);
// 获取JWT token
String jwt = getJwtFromRequest(request);
// 验证并删除JWT token
if (StringUtils.hasText(jwt) && tokenProvider.validateToken(jwt)) {
tokenProvider.deleteToken(jwt);
}
// 返回成功信息
return ResponseEntity.ok(new ApiResponse(true, "You have been successfully logged out."));
}
private String getJwtFromRequest(HttpServletRequest request) {
String bearerToken = request.getHeader("Authorization");
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
return bearerToken.substring(7, bearerToken.length());
}
return null;
}
}
```
spring boot 项目中加入jwt 鉴权
好的,我可以为您提供一些关于在Spring Boot项目中集成JWT鉴权的基本步骤:
1. 添加依赖:在您的Spring Boot项目中,需要添加以下依赖:
```
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
```
2. 创建JWT工具类:您可以创建一个名为`JwtUtils`的工具类,用于生成和解析JWT令牌。
3. 创建登录接口:您需要创建一个登录接口,用于验证用户身份并生成JWT令牌。在这个接口中,您需要验证用户提供的用户名和密码,并根据验证结果生成JWT令牌。
4. 创建JWT鉴权过滤器:您需要创建一个JWT鉴权过滤器,用于验证用户的身份和权限。在这个过滤器中,您需要解析JWT令牌,并验证令牌的有效性和权限。
5. 配置Spring Security:您需要配置Spring Security,以便在请求到达控制器之前应用JWT鉴权过滤器。
以上是基本的步骤,您可以根据您的具体需求进行调整和扩展。希望对您有所帮助!