初识 Spring Security

前言

Spring Security 是什么呢,在官网里时这样描述的

Spring Security是一个框架,提供 认证(authentication)、授权(authorization) 和 保护,以抵御常见的攻击。它对保护命令式和响应式应用程序有一流的支持,是保护基于Spring的应用程序的事实标准。

简而言之就是一个安全框架,能够很好的保护我们的 Spring 应用

Spring Security执行流程(简化)

image.png (图来自B站:三更草堂) 从图中可以看到,用户输入的用户名密码会被一路传到 DaoAuthenticationProvider(后文简称 DAP ), 然后由 InMemoryUserDetailsManager (实现了 UserDetailsService 接口)根据用户名从内存中查找到对应的用户信息并返回给 DAP 。 DAP 将查到的信息与用户输入的信息进行比对,如果正确则返回并存储认证对象(没有json返回值)。

整合数据库

上面提到,Spring Security 默认是在内存中查找用户信息,这是不符合我们实际开发的场景的。我们需要从数据库中查到真实的用户信息。 这时候就需要用到 UserDetailsService 接口,因为最后查找用户的操作是由该接口定义的,我们只需要实现该接口并实现 loadUserByUsername 方法,即可实现从数据库中查找用户信息。

java
复制代码
@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 对象。

java
复制代码
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
复制代码
java.lang.IllegalArgumentException:There is no PasswordEncoder mapped for the id "null"

这是由于没有配置密码加密器所引起的,密码加密器确保我们的密码在数据库中是以密文而不是明文存储的。为此我们需要进行以下的配置

java
复制代码
@Configuration public class SpringSecurityConfig { @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } }
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP