SpringSecurity随记
看的是B站三更草堂
的课,包括下面的笔记基本上也都整理自UP给出的资料
SpringSecurity完整流程
图中只展示了核心过滤器,其它的非核心过滤器并没有在图中展示
- UsernamePasswordAuthenticationFilter
- 处理登陆页面用户名密码的登陆请求
- ExceptionTranslationFilter
- 处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException
- FilterSecurityInterceptor
- 负责权限校验的过滤器
思路分析
登录
自定义登录接口
调用ProviderManager的方法进行认证 如果认证通过生成jwt
把用户信息存入redis中
自定义UserDetailsService
在这个实现类中去查询数据库
校验
定义Jwt认证过滤器
获取token
解析token获取其中的userid
从redis中获取用户信息
存入SecurityContextHolder
工具类
添加工具配置类
实现
核心代码实现
创建一个类实现UserDetailsService接口,重写其中的方法
@Service
public class UserDetailServiceImpl implements UserDetailsService {
@Autowired
private UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getUserName,username);
User user = userMapper.selectOne(queryWrapper);
if (Objects.isNull(user)){
throw new RuntimeException("用户名不存在");
}
return new LoginUser(user);
}
}
因为UserDetailsService方法的返回值是UserDetails类型,所以需要定义一个类,实现该接口,把用户信息封装在其中
@Data
@NoArgsConstructor
@AllArgsConstructor
public class LoginUser implements UserDetails {
private User user;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public String getPassword() {
return null;
}
@Override
public String getUsername() {
return null;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
密码加密储存
默认使用的PasswordEncoder
要求数据库中的密码格式为:{id}password
我们只需要使用把BCryptPasswordEncoder
对象注入Spring
容器中,SpringSecurity
就会使用该PasswordEncoder
来进行密码校验
我们可以定义一个SpringSecurity
的配置类,继承WebSecurityConfigurerAdapter
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
未完待续…
后续
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果