19.token认证过滤器代码实现_哔哩哔哩_bilibili19.token认证过滤器代码实现是SpringSecurity框架教程-Spring Security+JWT实现项目级前端分离认证授权-挑战黑马&尚硅谷的第20集视频,该合集共计41集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bilibili.com/video/BV1mm4y1X7Hc?p=20&vd_source=f230e9aa60a5cb08b03651a4c59ce1ab把通过认证的用户信息存入SecurityContextHolder是关键,这样最终把关的过滤器才能通过SecurityContextHolder上下文判断这个请求是否放行
基础入门教程,适合无经验初学者:
https://github.com/Kww0k/ims-projecthttps://github.com/Kww0k/ims-project
Spring Security可以通过配置AuthenticationProvider
来适配在数据库中存储的密码。你需要实现一个自定义的AuthenticationProvider
,使用Spring Security的加密功能来比较数据库中的加密密码和提供的密码。
以下是一个简化的例子:
-
首先,确保你的数据库中存储的是加密后的密码。
-
实现自定义的
AuthenticationProvider
,使用合适的加密方法和比较方式。
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.crypto.password.PasswordEncoder;
public class DatabaseAuthenticationProvider implements AuthenticationProvider {
private UserDetailsService userDetailsService;
private PasswordEncoder passwordEncoder;
public DatabaseAuthenticationProvider(UserDetailsService userDetailsService, PasswordEncoder passwordEncoder) {
this.userDetailsService = userDetailsService;
this.passwordEncoder = passwordEncoder;
}
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = authentication.getName();
String password = authentication.getCredentials().toString();
// 这里从数据库获取用户详情并进行加密密码的比较
UserDetails user = userDetailsService.loadUserByUsername(username);
if (passwordEncoder.matches(password, user.getPassword())) {
return new UsernamePasswordAuthenticationToken(user, password, user.getAuthorities());
}
throw new BadCredentialsException("Authentication failed");
}
@Override
public boolean supports(Class<?> authentication) {
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}
-
在Spring Security配置中注册这个
AuthenticationProvider
:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private UserDetailsService userDetailsService;
private PasswordEncoder passwordEncoder;
public SecurityConfig(UserDetailsService userDetailsService) {
this.userDetailsService = userDetailsService;
this.passwordEncoder = new BCryptPasswordEncoder();
}
@Bean
public AuthenticationProvider authenticationProvider() {
return new DatabaseAuthenticationProvider(userDetailsService, passwordEncoder);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// 配置HTTP安全性相关设置
}
}
确保你的UserDetailsService
实现能够从数据库中加载用户详情,并且密码是加密的。PasswordEncoder
用于比较提供的密码和数据库中存储的加密密码。
这个例子使用了BCryptPasswordEncoder,它是Spring Security中推荐的密码加密器。你可以根据需要替换为其他加密器。