Angular 6和基于Spring Boot的记住我功能与基于会话的登录可以通过以下步骤来实现:
login.component.html:
login.component.ts:
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { AuthService } from 'path-to-auth-service';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {
loginForm: FormGroup;
constructor(private formBuilder: FormBuilder, private authService: AuthService) { }
ngOnInit() {
this.loginForm = this.formBuilder.group({
username: ['', Validators.required],
password: ['', Validators.required],
rememberMe: [false]
});
}
login() {
const username = this.loginForm.controls['username'].value;
const password = this.loginForm.controls['password'].value;
const rememberMe = this.loginForm.controls['rememberMe'].value;
this.authService.login(username, password, rememberMe);
}
}
RememberMeServices.java:
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.rememberme.InMemoryTokenRepositoryImpl;
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
import org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices;
public class RememberMeServices extends TokenBasedRememberMeServices {
public RememberMeServices(String key, UserDetailsService userDetailsService) {
super(key, userDetailsService);
setTokenRepository(createTokenRepository());
}
private PersistentTokenRepository createTokenRepository() {
// 如果您使用内存存储Token,请使用InMemoryTokenRepositoryImpl
// 如果您使用数据库存储Token,请使用JdbcTokenRepositoryImpl
return new InMemoryTokenRepositoryImpl();
}
@Override
protected boolean rememberMeRequested(HttpServletRequest request, String parameter) {
// 检查请求中是否包含记住我参数
String rememberMe = request.getParameter(parameter);
return rememberMe != null && rememberMe.equalsIgnoreCase("true");
}
}
SecurityConfig.java:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
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.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Value("${rememberme.key}")
private String rememberMeKey;
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.and()
.rememberMe()
.rememberMeServices(rememberMeServices())
.key(rememberMeKey);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
public RememberMeServices rememberMeServices() {
return new RememberMeServices(rememberMeKey, userDetailsService);
}
}
LoginController.java:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login";
}
}