八SpringSecurity Web权限方案——记住我功能用户注销功能

Posted 上善若水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八SpringSecurity Web权限方案——记住我功能用户注销功能相关的知识,希望对你有一定的参考价值。

一、记住我功能

1.1、创建表

CREATE TABLE `persistent_logins` (
  `username` varchar(64) COLLATE utf8mb4_general_ci NOT NULL,
  `series` varchar(64) COLLATE utf8mb4_general_ci NOT NULL,
  `token` varchar(64) COLLATE utf8mb4_general_ci NOT NULL,
  `last_used` timestamp NOT NULL,
  PRIMARY KEY (`series`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

1.2、添加数据库配置

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test_db?serverTimezone=GMT%2B8
    username: root
    password: root

1.3、编写配置类

package com.xbmu.config;

import com.xbmu.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;

import javax.sql.DataSource;


@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter 

    @Autowired
    private LoginService loginService;
    @Autowired
    private DataSource dataSource;
    @Bean
    public PersistentTokenRepository persistentTokenRepository()
        JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
        // 赋值数据源
        jdbcTokenRepository.setDataSource(dataSource);
        // 自动创建表,第一次执行会创建,以后要执行就要删除掉!
        // jdbcTokenRepository.setCreateTableOnStartup(true);
        return jdbcTokenRepository;
    

    @Bean
    PasswordEncoder password() 
        return new BCryptPasswordEncoder();
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        // 开启记住我功能
        http.rememberMe().tokenRepository(persistentTokenRepository()).userDetailsService(loginService);

        http.exceptionHandling().accessDeniedPage("/unAuth.html");
        http.formLogin() // 自定义登录页面
                .loginPage("/login.html") // 设置登录页面
                .loginProcessingUrl("/user/login") // 登录请求访问路径
                .defaultSuccessUrl("/user/index").permitAll() // 登录成功之后,跳转的路径。
                .and().authorizeRequests()
                .anyRequest().authenticated() // 设置其他请求需要认证
                .and().csrf().disable(); // 关闭csrf防护
    

1.4、页面添加记住我复选框

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/user/login" method="post">
    用户名:<input type="text" name="username"/>
    <br/>
    密 码:<input type="password" name="password"/>
    <br/>
    记住我:<input type="checkbox" name="remember-me" title="记住密码"/>
    <br/>
    <input type="submit" name="login" title="登录"/>
</form>
</body>
</html>

1.5、测试


登录成功之后,关闭浏览器再次访问 http://localhost:8081/user/index,发现依然可以使用!

1.6、设置有效期

默认2周时间。但是可以通过设置状态有效时间,即使项目重新启动下次也可以正常登录。

二、用户注销功能

2.1、在登录成功页面添加一个退出链接

success.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
登录成功<br>
<a href="/logout">退出</a>
</body>
</html>

2.2、在配置类中添加退出映射地址

2.3、测试


以上是关于八SpringSecurity Web权限方案——记住我功能用户注销功能的主要内容,如果未能解决你的问题,请参考以下文章

四SpringSecurity Web权限方案

[SpringSecurity]web权限方案_用户注销

六SpringSecurity Web权限方案—— 基于数据库实现权限认证

六SpringSecurity Web权限方案—— 基于数据库实现权限认证

[SpringSecurity]web权限方案_用户授权_自定义403页面

五SpringSecurity Web权限方案——自定义登录页面与权限访问控制