首页 > 其他分享 >SpringSecurity-记得我

SpringSecurity-记得我

时间:2024-01-20 17:13:43浏览次数:22  
标签:记得 数据库 用户 private 认证 token 过滤器 SpringSecurity

原理

IMG_256

在用户发送认证请求之后,或调用我们之前说过的usernamePasswordAuthenticationFilter这个过滤器,认证成功之后会调用一个RemeberMeService服务;负责针对每一用户生成一个Token,然后将token写入到浏览器的Cookie里面,同时会使用:TokenRepository将这个token写入数据库中。将Token写入数据库时候,同时会把用户认证成功的用户名一并写入数据库(此时用户名和token是一一对应的)中因为我们是在用户认证成功之后做的,所以会将用户信息写入,下次用户访问的时候就不需要再次登录了。当用户下次请求的时候会经过过滤器链中的RemeberMeAuthenticationFilter(这个过滤器作用就是读取cookie中token)然后交给RemeberMeService,RemeberMeService通过TokenRepository到数据库去查询这个Token数据库里面有没有记录。如果有记录就去除用户名,取出用户名之后,就会去调用UserDetailsService,获取用户信息,然后把获取的当前用户信息放到SecurityContext里面。这样就把用户登录上了。

RemeberMeAuthenticationFilter在我们的过滤器链中绿色过滤器中,他是在倒数第二个位置。前面是其他的认证,其他的认证都没法认证用户信息的时候RemeberMeAuthenticationFilter尝试去做认证。

IMG_256

实现

前端

IMG_256

配置TokenRepository

配置TokenRepository读取数据库,SecurityConfig类中配置

BrowserSecurityConfig类中

  1. 配置PersistentTokenRepository 读写数据库
  2. 配置token过期的秒数
  3. 验证token,配置UserDetailsService的实现类
@Configuration
public class BrowserSecurityConfigOld extends WebSecurityConfigurerAdapter {

    //security配置类
    @Autowired
    private SecurityProperties securityProperties;

    @Autowired
    private MyAuthenticationFailureHandler myAuthenticationFailureHandler;
    @Autowired
    private MyAuthenticationSuccessHandler myAuthenticationSuccessHandler;

    @Autowired
    private DataSource dataSource;//yml文件中,spring.datasource
    @Autowired
    private UserDetailsService userDetailsService; //实现UserDetailsServiceImpl

    @Bean
    public PersistentTokenRepository persistentTokenRepository(){
        JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
        jdbcTokenRepository.setDataSource(dataSource);//配置数据源
        //在启动的时候会自动创建存放记住我的表(persistent_logins),如果存在会报错(手动创建)
        //jdbcTokenRepository.setCreateTableOnStartup(true);
        return jdbcTokenRepository;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 图片验证码过滤器
            //创建验证码过滤器,验证器使用自定义错误处理
        ValidateCodeFilter validateCodeFilter = new ValidateCodeFilter(/*myAuthenticationFailureHandler*/);
        //配置验证码过滤url
        //validateCodeFilter.setSecurityProperties(securityProperties);
        validateCodeFilter.afterPropertiesSet();

        //加入过滤器链,在UsernamePasswordAuthenticationFilter之前
        http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class)
        .addFilterBefore(smsCodeFilter, UsernamePasswordAuthenticationFilter.class)
        .formLogin()  //表单登陆认证方法,浏览器跳转到specurity默认登陆页面
            //http.httpBasic()//浏览器弹出登陆对话框登陆认证方式
            //.loginPage("/login.html")//自定义登陆页面
            .loginPage("/authentication/require")//自定义登陆url
            .loginProcessingUrl("/authentication/form")//用户登陆提交接口
            .successHandler(myAuthenticationSuccessHandler)
            .failureHandler(myAuthenticationFailureHandler)
            .and()
            .rememberMe()
            .tokenRepository(persistentTokenRepository())//配置remeberMe的token操作
            .tokenValiditySeconds(securityProperties.getBrowser().getRememberMeSeconds()) // rememberME 有效期         
            .userDetailsService(userDetailsService) //验证记得我的token
            .and()
        .authorizeRequests() ////设置请求符合访问资源的权限
            .antMatchers(securityProperties.getBrowser().getLoginPage(),"/myLogin.html","/code/*","/authentication/require","/authentication/mobile")//匹配器
            .permitAll()//访问这两个页面不需要认证
            .anyRequest().authenticated() //对任何请求都要登陆认证后才能访问
            .and()
        .csrf().disable()//关闭跨域伪造关闭
                .apply(smsCodeAuthenticationSecurityConfig);
    }
    @Bean
    public PasswordEncoder passwordEncoder() {
        //return NoOpPasswordEncoder.getInstance(); //已弃用
        return new BCryptPasswordEncoder();
    }
}

数据库表

JdbcTokenRepositoryImpl 类中有一个变量

创建表有两种思路:

  1. 拷贝出sql语句,手动创建

CREATE TABLE persistent_logins (

    username VARCHAR (64) NOT NULL,

    series VARCHAR (64) PRIMARY KEY,

    token VARCHAR (64) NOT NULL,

    last_used datetime NOT NULL

);

  2. jdbcTokenRepository.setCreateTableOnStartup(true);

    在启动的时候会自动创建存放记住我的表(persistent_logins),如果存在会报错(手动创建)

标签:记得,数据库,用户,private,认证,token,过滤器,SpringSecurity
From: https://www.cnblogs.com/wangzhilei-src/p/17976744

相关文章

  • SpringSecurity-图片验证码
    图片验证码生成Core模块封装验证码类publicclassImageCode{    privateBufferedImageimage;    /**     *code是一个随机数,图片是根据随机数生成的,     *存放到session里面,后面用户提交登录请求时候要去验证的     */    private......
  • SpringSecurity-认证流程源码级详解
    自定义用户认证逻辑处理用户信息获取逻辑:UserDetailsService处理用户校验逻辑:UserDetails处理密码加密解密:PasswordEncoder认证处理流程以表单认证为例:从发起认证请求到认证过滤器,接着认证成功后,响应从认证过滤器返回的整个过程。SpringSecurity做了什么,设计到了哪些类?他......
  • SpringSecurity系列,第四章:源码分析
    源码分析SpringSecurity的核心功能即为:认证(Authentication)、授权(Authorization)一、概览1、在SpringSecurity中,用户的认证信息主要由Authentication的实现类来保存,Authentication接口定义如下:【保存用户认证信息】publicinterfaceAuthenticationextendsPrin......
  • SpringSecurity表单认证(二)
    用户名+密码系统默认登录用户名:user密码每次服务启动后随机生成密码用户信息获取原理(数据库获取)实现该接口,security默认自动生成密码关闭。框架源码:packageorg.springframework.security.core.userdetails;publicinterfaceUserDetailsService{UserDetailsloa......
  • SpringSecurity表单认证(一)
    配置类创建securityConfig,并继承WebSecurityConfigurerAdapter,它是web应用的安全适配器重写configure方法,共有三个,重写参数为http的configure方法configure(HttpSecurityhttp)方法,配置表单登陆认证方法,任何请求都需要表单认证@Overrideprotectedvoidconfigure(HttpSe......
  • 华为常用的命令——display,记得点赞收藏!
    华为设备提供了多条display命令用于查看硬件部件、接口及软件的状态信息。通常这些状态信息可以为用户故障处理提供定位思路。常用的故障信息搜集的命令如下:路由器常用维护命令表交换机常用的故障信息搜集关注工仲好:IT运维大本营,获取60个G的《网工大礼包》......
  • springsecurity 使用浅谈(一)
    1.背景springsecurity框架主要用于Web应用的认证和授权。所谓认证就是验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户。而授权就是经过认证后判断当前用户是否有权限进行某个操作。认证和授权也是SpringSecurity作为安全框架的核心功能。2.前置知识在......
  • SpringSecurity:自定义身份认证异常处理器不生效
    由于我配置了全局异常处理器,再配置身份认证异常处理器后,发现异常直接被全局异常处理器捕获了@RestControllerAdvice("com.gsy.wy")@Slf4jpublicclassGlobalException{@ExceptionHandler(Exception.class)publicResulthandlerException(Exceptione){l......
  • SpringSession+SpringSecurity中如何保存Authentication到Session中的Attribute
     org.springframework.security.web.context.SecurityContextPersistenceFilter#doFilter(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse,javax.servlet.FilterChain) org.springframework.security.web.context.HttpSessionSecurityC......
  • SpringSecurity
    SpringSecurity(安全)王富贵(lmlx66.top)1、简介SpringSecurity是Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富一般来说中大型的项目都是使用SpringSecurity来做安全框架。小项目有Shiro的比较多,因为相比与S......