用SpringSecurity写一个登录验证
时间: 2024-02-22 22:50:09 浏览: 92
一个简单的Spring验证登录示例
Spring Security是一个基于Spring的安全框架,用于实现身份验证、授权、安全配置等功能。下面是一个使用Spring Security实现登录验证的示例:
1. 添加Spring Security依赖
在pom.xml文件中添加以下依赖:
```
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>5.3.4.RELEASE</version>
</dependency>
<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>
```
2. 编写Security配置类
创建一个Security配置类,继承WebSecurityConfigurerAdapter,并重写configure方法,配置用户认证、授权等信息。
```
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.failureUrl("/login?error=true")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login")
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
```
上述代码中,我们配置了:
- 登录页面为"/login",登录成功后跳转到"/home"页面,登录失败后跳转到"/login?error=true"页面。
- "/login"页面和"/logout"请求不需要身份认证。
- 其他请求需要身份认证。
- 用户信息从userDetailsService中获取,使用BCryptPasswordEncoder进行密码加密。
3. 实现UserDetailsService接口
创建一个实现UserDetailsService接口的类,用于从数据库中获取用户信息。
```
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("User not found");
}
return new org.springframework.security.core.userdetails.User(user.getUsername(),
user.getPassword(),
Collections.singletonList(new SimpleGrantedAuthority(user.getRole())));
}
}
```
上述代码中,我们从userRepository中获取用户信息,并返回一个UserDetails对象。UserDetails对象包含用户名、密码、角色等信息。
4. 编写登录页面和控制器
在登录页面中,需要包含一个表单,用于输入用户名和密码。
```
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
<h3>Login Page</h3>
<c:if test="${not empty error}">
<p style="color: red;">Invalid username or password.</p>
</c:if>
<form action="<c:url value='/login'/>" method="post">
<table>
<tr>
<td>Username:</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="Login"/></td>
</tr>
</table>
</form>
</body>
</html>
```
在控制器中,处理登录请求和注销请求。
```
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login";
}
@GetMapping("/home")
public String home() {
return "home";
}
@GetMapping("/logout")
public String logout(HttpServletRequest request, HttpServletResponse response) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null) {
new SecurityContextLogoutHandler().logout(request, response, authentication);
}
return "redirect:/login?logout=true";
}
}
```
上述代码中,我们定义了三个方法:
- login方法,用于显示登录页面。
- home方法,用于显示登录成功后的页面。
- logout方法,用于注销用户。
5. 配置登录页面和静态资源访问
在Spring Boot中,我们可以通过在application.properties或application.yml中配置静态资源访问和登录页面。
```
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/
spring.security.form-login.login-page=/login
```
上述代码中,我们配置了:
- 静态资源路径为"/static/**",静态资源文件夹为"classpath:/static/"。
- 登录页面为"/login"。
至此,我们已经完成了使用Spring Security实现登录验证的示例。
阅读全文