带你初步认识一下Spring Security
前言
Spring Security 是什么呢,在官网里时这样描述的
Spring Security是一个框架,提供 认证(authentication)、授权(authorization) 和 保护,以抵御常见的攻击。它对保护命令式和响应式应用程序有一流的支持,是保护基于Spring的应用程序的事实标准。
简而言之就是一个安全框架,能够很好的保护我们的 Spring 应用
Spring Security执行流程(简化)
(图来自B站:三更草堂) 从图中可以看到,用户输入的用户名密码会被一路传到 DaoAuthenticationProvider(后文简称 DAP ), 然后由 InMemoryUserDetailsManager (实现了 UserDetailsService 接口)根据用户名从内存中查找到对应的用户信息并返回给 DAP 。 DAP 将查到的信息与用户输入的信息进行比对,如果正确则返回并存储认证对象(没有json返回值)。
整合数据库
上面提到,Spring Security 默认是在内存中查找用户信息,这是不符合我们实际开发的场景的。我们需要从数据库中查到真实的用户信息。 这时候就需要用到 UserDetailsService 接口,因为最后查找用户的操作是由该接口定义的,我们只需要实现该接口并实现 loadUserByUsername 方法,即可实现从数据库中查找用户信息。
@Resource
private SysUserService sysUserService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
SysUser user = sysUserService.getUserByUserName(username);
if (user == null) {
throw new RuntimeException("账号或密码错误");
}
LoginUser loginUser = new LoginUser(user);
return loginUser;
}
复制代码
loadUserByUsername 方法要求返回的 UserDeatils 对象是 Spring Security 的内置用户对象,我们可以通过组合的方式将查出的用户封装为 UserDeatils 对象。
package com.cowz.databasedemo.entity.security;
import com.cowz.databasedemo.entity.SysUser;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
@NoArgsConstructor
@AllArgsConstructor
public class LoginUser implements UserDetails {
private SysUser user;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getUsername();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
复制代码
其中 SysUser 就是我们系统中的用户对象。
密码加密器
做完以上操作在进行测试时,会报一个异常
java.lang.IllegalArgumentException:There is no PasswordEncoder mapped for the id "null"
复制代码
这是由于没有配置密码加密器所引起的,密码加密器确保我们的密码在数据库中是以密文而不是明文存储的。为此我们需要进行以下的配置
@Configuration
public class SpringSecurityConfig {
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
还没有评论,来说两句吧...