初识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 方法,即可实现从数据库中查找用户信息。

    @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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值