1. 程式人生 > >SpringSecurity(七)新增記住我功能

SpringSecurity(七)新增記住我功能

記住我基本原理

使用者認證成功後呼叫RemeberMeService服務,這個服務裡有一個TokenRepository,它會生成一個Token寫入瀏覽器Cookie,同時它還會使用TokenRepository將Token和使用者名稱寫入到資料庫中。

當用戶再次訪問系統時,過濾器鏈如下所示,請求會經過RememberMeAuthenticationFilter過濾器,該過濾器會讀取cookie中的Token並將其交給RemeberMeService,TokenRepository會使用該Token去資料庫裡查是否存在,如果存在則取出使用者名稱,去除使用者名稱之後就會呼叫UserDetailsService獲取使用者資訊,然後將使用者資訊放入SecurityContext裡面,這樣就把使用者登入上去了。

實現步驟

1. 新建 persistent_logins表

create table persistent_logins (username varchar(64) not null, series varchar(64) primary key, token varchar(64) not null, last_used timestamp not null)

2. 新增資料庫的相關依賴和配置

pom.xml

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

application.properties

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root

3. SpringSecurityConfig配置類,為了看清楚添加了哪些資訊,所以省略了其他的資訊

@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {


    @Autowired
    private DataSource dataSource;

    @Bean
    public PersistentTokenRepository persistentTokenRepository() {
        JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
        tokenRepository.setDataSource(dataSource);
        // tokenRepository.setCreateTableOnStartup(true);
        // create table persistent_logins (username varchar(64) not null, series varchar(64) primary key, token varchar(64) not null, last_used timestamp not null)
        return tokenRepository;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                    .rememberMe()
                    .tokenRepository(persistentTokenRepository())
                    .tokenValiditySeconds(24*60*60) // 過期秒數
                    .userDetailsService(myUserService)

                ;
    }
}