栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring Security (用户注销 + 自动登录(RememberMe)) (三)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Security (用户注销 + 自动登录(RememberMe)) (三)

文章目录
      • 1.用户注销
      • 2.自动登录原理分析
        • 2.1 认证请求
        • 2.2 服务请求
      • 3.自动登录功能实现
        • 3.1 数据库准备
        • 3.2 配置类注入数据源
        • 3.3 设置configure
        • 3.4 设置页码选项
        • 3.5 测试

1.用户注销

用户注销: 表示退出之前可以直接登录, 用户注销之后需要密码和用户才可以登录

配置类:

这个意思是修改配置类, 使得登录成功以后跳转到成功的页面, 然后成功的页面上有退出的按钮。

如果没有按的时候, 会直接登录, 如果按后需要认证。





当不按的时候, 直接访问localhost:8111/test/hello, 直接访问


当点击退出后, 则需要认证

2.自动登录原理分析

自动登录实现:

  • cookie
  • 安全框架SpringSecurity

安全框架SpringSecurity 实现原理:


SpringSecurity对于这个功能有了很多的封装

2.1 认证请求
  1. UsernamePasswordAuthenticationFilter -> AbstractAuthenticationProcessingFilter
  2. AbstractAuthenticationProcessingFilter#successfulAuthentication()
  3. AbstractRememberMeServices#loginSuccess()

  1. PersistentTokenBasedRememberMeServices#onLoginSuccess()

    生成token, 然后添加到cookie中

  1. JdbcTokenRepositoryImpl#createNewToken()

通过上面的步骤将token写入到数据库中。

2.2 服务请求
  1. RememberMeAuthenticationFilter#doFilter()

  1. AbstractRememberMeServices#autoLogin()

  1. 认证代码:
	public void check(UserDetails user) {
		if (!user.isAccountNonLocked()) {
			throw new LockedException(messages.getMessage(
					"AccountStatusUserDetailsChecker.locked", "User account is locked"));
		}

		if (!user.isEnabled()) {
			throw new DisabledException(messages.getMessage(
					"AccountStatusUserDetailsChecker.disabled", "User is disabled"));
		}

		if (!user.isAccountNonExpired()) {
			throw new AccountExpiredException(
					messages.getMessage("AccountStatusUserDetailsChecker.expired",
							"User account has expired"));
		}

		if (!user.isCredentialsNonExpired()) {
			throw new CredentialsExpiredException(messages.getMessage(
					"AccountStatusUserDetailsChecker.credentialsExpired",
					"User credentials have expired"));
		}
	}
3.自动登录功能实现 3.1 数据库准备

3.2 配置类注入数据源
    @Autowired
    private DataSource dataSource;

    @Bean
    public PersistentTokenRepository persistentTokenRepository(){
        JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
        tokenRepository.setDataSource(dataSource);
        return tokenRepository;
    }
3.3 设置configure

                .and().rememberMe().tokenRepository(persistentTokenRepository())
                .tokenValiditySeconds(60)// 60S
                .userDetailsService(userDetailsService)
3.4 设置页码选项

这里必须为 type=“checkbox” name=“remember-me”

3.5 测试

http://localhost:8111/success.html


直接登录进去


数据库增加了token的信息


再登录的话不用输密码就可以直接登录了。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/884180.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号