下面是详细讲解"Spring Security账户与密码验证实现过程"的完整攻略。
Spring Security账户与密码验证实现过程
Spring Security 是一个功能强大的权限验证框架,它提供了多种认证方式,其中最常用的是账户与密码验证方式。本文将介绍实现 Spring Security 账户与密码验证的完整过程。
步骤一:添加 Spring Security 的依赖
首先需要在项目中添加 Spring Security 的相关依赖,在 Maven 中添加以下依赖代码:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.3.4.RELEASE</version>
</dependency>
步骤二:创建用户实体类
需要创建一个实体类来表示用户信息,其中包含用户名和密码等基本信息。在实体类中添加 @Entity
注解,并使用 @Table
注解来表示对应的数据库表。
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false)
private String password;
// getter 和 setter 方法...
}
步骤三:创建用户服务类
需要创建一个类来提供用户服务,包含用户信息和密码的管理。这里使用了 Spring Data JPA 作为数据访问层。
@Service
public class UserServiceImpl implements UserService, UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException(username);
}
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(),
true, true, true, true,
AuthorityUtils.createAuthorityList("USER"));
}
// 其他用户服务方法...
}
步骤四:创建 Spring Security 配置类
需要创建一个配置类来配置 Spring Security,添加 @Configuration
和 @EnableWebSecurity
注解,并继承 WebSecurityConfigurerAdapter
类实现具体配置。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.permitAll()
.and()
.logout()
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
}
这里配置了 Spring Security 的登录相关逻辑,访问 /login
页面时不需要进行认证,访问其他页面需要进行认证才能访问。另外,当用户登录成功后,跳转到 /home
页面。
示例一:基本的用户名和密码验证
创建一个登录页面,当用户在界面中输入正确的用户名和密码时,可以成功登录后跳转到主页面。
HTML 页面代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
<h2>Login with Username and Password</h2>
<form action="/login" method="post">
<label>Username: </label><input type="text" name="username" /><br>
<label>Password: </label><input type="password" name="password" /><br>
<button type="submit">Login</button>
</form>
</body>
</html>
Controller 代码:
@Controller
public class LoginController {
@GetMapping("/login")
public String showLoginForm() {
return "login";
}
@GetMapping("/home")
public String showHomePage() {
return "home";
}
}
示例二:使用自定义表单进行登录
使用一个自定义的表单来进行登录,在登录表单中添加了验证码的验证逻辑。
HTML 页面代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login Page</title>
<style type="text/css">
.error {
color: red;
}
</style>
</head>
<body>
<h2>Login with Username and Password</h2>
<form th:action="@{/login}" method="post">
<table>
<tr>
<td><label>Username: </label></td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td><label>Password: </label></td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td><label>Verification code: </label></td>
<td><input type="text" name="code" /></td>
</tr>
<tr>
<td colspan="2"><img src="/code" /></td>
</tr>
<tr>
<td colspan="2"><button type="submit">Login</button></td>
</tr>
</table>
</form>
<p th:text="${msg}" class="error"></p>
</body>
</html>
Controller 代码:
@Controller
public class LoginController {
@GetMapping("/login")
public String showLoginForm() {
return "login";
}
@PostMapping("/login")
public String login(
HttpServletRequest request,
String username,
String password,
String code,
Model model) {
HttpSession session = request.getSession();
String verifyCode = (String) session.getAttribute("VERCODE_KEY");
// 判断验证码是否正确
if (!code.equalsIgnoreCase(verifyCode)) {
model.addAttribute("msg", "Invalid verification code");
return "login";
}
return "home";
}
@GetMapping("/home")
public String showHomePage() {
return "home";
}
@GetMapping("/code")
public void getCode(HttpServletRequest req, HttpServletResponse resp) throws Exception {
/*
* 生成验证码逻辑,省略代码
*/
}
}
这里需要在 Controller 中增加一个 /code
的方法来生成验证码,并在登录表单中展示当前的验证码。当用户提交表单时,需要先判断验证码是否正确,如果正确,则可以进行用户名和密码的验证。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Security账户与密码验证实现过程 - Python技术站