一文带你搞懂 Spring Security

今天来一篇 Spring Security 精讲,相信你看过之后能彻底搞懂 Spring Security。

Spring Security简介

Spring Security 是一种高度自定义的安全框架,利用(基于)SpringIOC/DI和AOP功能,为系统提供了声明式安全访问控制功能,「减少了为系统安全而编写大量重复代码的工作」 。

「核心功能:认证和授权」

Spring Security 认证流程

SpringSecurity认证执行流程

Spring Security 项目搭建

导入依赖

Spring Security已经被Spring boot进行集成,使用时直接引入启动器即可

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

访问页面

导入spring-boot-starter-security启动器后,Spring Security已经生效,默认拦截全部请求,如果用户没有登录,跳转到内置登录页面。

在浏览器输入:http://localhost:8080/ 进入Spring Security内置登录页面

用户名:user。

密码:项目启动,打印在控制台中。

自定义用户名和密码

修改「application.yml」 文件

# 静态用户,一般只在内部网络认证中使用,如:内部服务器1,访问服务器2
spring:
  security:
    user:
      name: test  # 通过配置文件,设置静态用户名
      password: test # 配置文件,设置静态登录密码

UserDetailsService详解

什么也没有配置的时候,账号和密码是由Spring Security定义生成的。而在实际项目中账号和密码都是从数据库中查询出来的。所以我们要通过「自定义逻辑控制认证逻辑」 。如果需要自定义逻辑时,只需要实现UserDetailsService接口

@Component
public class UserSecurity implements UserDetailsService {

    @Autowired
    private UserService userService;

    @Override
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {

        User user = userService.login(userName);
        System.out.println(user);
        if (null==user){
            throw new UsernameNotFoundException("用户名错误");
        }
        org.springframework.security.core.userdetails.User result =
                new org.springframework.security.core.userdetails.User(
                        userName,user.getPassword(), AuthorityUtils.createAuthorityList()
                );
        return result;
    }

}

PasswordEncoder密码解析器详解

PasswordEncoder

「PasswordEncoder」 是SpringSecurity 的密码解析器,用户密码校验、加密 。自定义登录逻辑时要求必须给容器注入PaswordEncoder的bean对象

SpringSecurity 定义了很多实现接口「PasswordEncoder」 满足我们密码加密、密码校验 使用需求。

PasswordEncoder密码解析器详解

自定义密码解析器

  1. 编写类,实现PasswordEncoder 接口

/**
 * 凭证匹配器,用于做认证流程的凭证校验使用的类型
 * 其中有2个核心方法
 * 1. encode - 把明文密码,加密成密文密码
 * 2. matches - 校验明文和密文是否匹配
 * */
public class MyMD5PasswordEncoder implements PasswordEncoder {

    /**
     * 加密
     * @param charSequence  明文字符串
     * @return
     */
    @Override
    public String encode(CharSequence charSequence) {
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            return toHexString(digest.digest(charSequence.toString().getBytes()));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return "";
        }
    }

    /**
     * 密码校验
     * @para
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值