带你初步认识一下Spring Security

亦凉 2024-03-22 11:24 114阅读 0赞

前言

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

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

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

Spring Security执行流程(简化)

format_png

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

整合数据库

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

  1. @Resource
  2. private SysUserService sysUserService;
  3. @Override
  4. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  5. SysUser user = sysUserService.getUserByUserName(username);
  6. if (user == null) {
  7. throw new RuntimeException("账号或密码错误");
  8. }
  9. LoginUser loginUser = new LoginUser(user);
  10. return loginUser;
  11. }
  12. 复制代码

loadUserByUsername 方法要求返回的 UserDeatils 对象是 Spring Security 的内置用户对象,我们可以通过组合的方式将查出的用户封装为 UserDeatils 对象。

  1. package com.cowz.databasedemo.entity.security;
  2. import com.cowz.databasedemo.entity.SysUser;
  3. import lombok.AllArgsConstructor;
  4. import lombok.NoArgsConstructor;
  5. import org.springframework.security.core.GrantedAuthority;
  6. import org.springframework.security.core.userdetails.UserDetails;
  7. import java.util.Collection;
  8. @NoArgsConstructor
  9. @AllArgsConstructor
  10. public class LoginUser implements UserDetails {
  11. private SysUser user;
  12. @Override
  13. public Collection<? extends GrantedAuthority> getAuthorities() {
  14. return null;
  15. }
  16. @Override
  17. public String getPassword() {
  18. return user.getPassword();
  19. }
  20. @Override
  21. public String getUsername() {
  22. return user.getUsername();
  23. }
  24. @Override
  25. public boolean isAccountNonExpired() {
  26. return true;
  27. }
  28. @Override
  29. public boolean isAccountNonLocked() {
  30. return true;
  31. }
  32. @Override
  33. public boolean isCredentialsNonExpired() {
  34. return true;
  35. }
  36. @Override
  37. public boolean isEnabled() {
  38. return true;
  39. }
  40. }
  41. 复制代码

其中 SysUser 就是我们系统中的用户对象。

密码加密器

做完以上操作在进行测试时,会报一个异常

  1. java.lang.IllegalArgumentException:There is no PasswordEncoder mapped for the id "null"
  2. 复制代码

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

  1. @Configuration
  2. public class SpringSecurityConfig {
  3. @Bean
  4. public PasswordEncoder passwordEncoder(){
  5. return new BCryptPasswordEncoder();
  6. }
  7. }

发表评论

表情:
评论列表 (有 0 条评论,114人围观)

还没有评论,来说两句吧...

相关阅读

    相关 认识spring security

    在一个系统中认证和授权是常有的事情,现在比较流行的框架有spring security、shiro等等。他们都能很好的帮助我们完成认证和授权的功能。那么假如说让我们自己完成一个

    相关 初步认识Spring

    (一)Spring是什么? (1)Spring是优秀的开源框架 (2)Spring是为了简化企业级应用开发而生的。 (3)Spring是一个IOC(DI)和AOP的