[Spring Security]安全框架学习Day02

今天主要是跟着B站视频看源码

虽然看的似懂非懂...但是应该有所理解???

安全框架的附加功能:Remember Me

核心代码如下:

package com.manage.security;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.FormLoginConfigurer;
import org.springframework.security.config.annotation.web.configurers.RememberMeConfigurer;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.DefaultSecurityFilterChain;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;

import javax.sql.DataSource;

/**
 * @author 
 * @time 2024/1/26 13:34
 */

@Configuration
@EnableWebSecurity
public class MySecurityConfiguration extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {

    @Autowired
    private DataSource dataSource;

    @Autowired
    private UserDetailsService userDetailsService;

//    DefaultSecurityFilterChain 用于提供一个默认的安全过滤器链,这个类实现了SecurityFilterChain接口,该接口只有一个方法getFilters(),用于获取安全过滤器列表

//    HttpSecurity 用于Security框架中的配置处理 提供一些方法来配置安全过滤器链,这个类实现了SecurityBuilder接口,该接口只有一个方法build(),用于创建一个安全过滤器链

//    继承适配器后需要重写方法

    /**
     * 注入自定义的密码加密器 创建一个passwordEncoder对象
     * @return PasswordEncoder
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
//        构造方法可以传递整型参数4-31,表示加密强度,值越大加密强度越高,默认值是10
        return new BCryptPasswordEncoder();
    }


    /**
     * 注入自定义的持久化token仓库
     * 创建一个Bean对象
     * 这个Bean对象,使用的是SpringSecurity提供的JdbcTokenRepositoryImpl类
     * JdbcTokenRepositoryImpl 基于DataSource数据源连接池,访问指定的数据库
     * 把认证成功的用户信息,需要Remember Me的,保存到数据库中
     * @param dataSource 数据源对象
     * @return PersistentTokenRepository
     */
    @Bean
    public PersistentTokenRepository persistentTokenRepository(DataSource dataSource){
        JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
        jdbcTokenRepository.setDataSource(dataSource); //设置数据源
//        初始化参数,仅第一次自动启动当前项目时设置为Ture,以后启动项目时设置为False,否则会报错
//        如果设置为True 启动时会自动链接数据库,创建表格,表格就是保存rememberMe数据的
        jdbcTokenRepository.setCreateTableOnStartup(false); //设置启动时自动创建表
        return jdbcTokenRepository;
    }

    /**
     * 注入自定义的安全过滤器链
     * @param security
     * @return
     */
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity security) throws Exception {
//        securityFilterChain对象 不需要手工new 可以通过SecurityConfigurerAdapter的getBuilder()方法获取

//        创建匿名类对象,实现认证相关配置
        Customizer<FormLoginConfigurer<HttpSecurity>> customizer = new Customizer<FormLoginConfigurer<HttpSecurity>>() {
            @Override
            public void customize(FormLoginConfigurer<HttpSecurity> configurer) {
//                具体的认证配置
                configurer.loginPage("/login") //设置登录页面的请求地址 必须是get请求
                        .loginProcessingUrl("/login")
                        .usernameParameter("username") //设置登录页面的用户名参数名
                        .passwordParameter("password") //设置登录页面的密码参数名
//                        .defaultSuccessUrl("/index") //设置登录成功后跳转的页面
//                        其实可以不用注释掉 因为会覆盖
                        .successHandler(new MyAuthenticationSuccessHandler("/lyq/index",true)) //设置登录成功后的处理器
//                        .failureUrl("/loginFail")
                        .failureHandler(new MyAuthenticationFailureHandler("/login",true)) //设置登录失败后的处理器
                ;
            }
        };
//        设置认证配置
        security.formLogin(customizer);

//        配置RememberMe相关信息
        Customizer<RememberMeConfigurer<HttpSecurity>> rememberMe = new Customizer<RememberMeConfigurer<HttpSecurity>>() {
            @Override
            public void customize(RememberMeConfigurer<HttpSecurity> configurer) {
                configurer
                        .tokenRepository(persistentTokenRepository(dataSource)) //设置持久化token仓库 设置保存记住我数据的具体对象
                        .rememberMeParameter("remember-me") //设置登录页面的记住我参数名
                        .rememberMeCookieName("remember-me") //设置浏览器中的cookie名
                        .rememberMeCookieDomain("localhost") //设置浏览器中的cookie的作用域
                        .tokenValiditySeconds(60*60*24*7) //设置token有效期 单位秒 默认1800秒
                        .userDetailsService(userDetailsService) //设置自定义的UserDetailsService
                ;
            }
        };
        security.rememberMe(rememberMe);

//        授权配置
        security.authorizeRequests()
                .requestMatchers("/login","/loginFail").permitAll() //登录页面不需要认证
                .anyRequest().authenticated() //其他页面需要认证
        ;

        security.csrf().disable(); //关闭csrf防护
        return security.build();
    }
}

加入记住我功能后 首次登陆会创建一个新的数据库

在登录时 需要加入参数remember-me

如果为True 则会在数据库中添加一条记录 浏览器的cookie也会添加一条记录

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值