1、准备两个页面,登录页面和登录成功页面。
注意:表单中 username、password 以及表单提交必须post,不要修改,这个是UsernamePasswordAuthenticationFilter中定义的,当然可以通过配置进行修改。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="post">
用户名: <input type="text" name="username"/> <br/>
密码: <input type="password" name="password"/> <br/>
<input type="submit" value="登录" />
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>登录成功!</div>
</body>
</html>
2、自定义UserDetailsService的实现类,并注册到spring容器
@Service
public class UserService implements UserDetailsService {
@Autowired
private BCryptPasswordEncoder passwordEncoder;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
System.out.println("这里应该根据username去数据库中查询,返回一个user,在封装为User对象才对");
return new User("admin",passwordEncoder.encode("123"), AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
}
}
3、配置Spring Security的配置类:配置了 PassEncoder 和 拦截规则
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public BCryptPasswordEncoder getBCryptPasswordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
// 自定义登录页面 写的登录页面
.loginPage("/login.html")
// 自定义登录逻辑 不用自己写,相当于遇到这个login请求的时候,
// spring security 就会拦截到走自己内置的登录逻辑
.loginProcessingUrl("/login")
// 登录成功后跳转 请求 必须是post,这个登录成功后 写一个controller处理这个请求
.successForwardUrl("/toMain")
.and()
.authorizeRequests()
.antMatchers("/login.html").permitAll()
.anyRequest()
.authenticated();
// 需要关闭 否则访问不到,后期修改为JWT形式 就把这个关闭就行了 因为使用token,就用不到
// Cookie了
http.csrf().disable();
}
}
4、写一个controller 处理toMain请求
package com.xxx.springsecuritydemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author zongzhibin
* @Date 2021/9/15 13:17
*/
@RequestMapping
@Controller
public class LoginController {
@PostMapping("/toMain")
public String toMain(){
return "redirect:main.html";
}
}