Spring Security是一个非常强大的安全框架,提供了丰富的功能和灵活的配置选项,可以很方便地集成到Spring Boot项目中。
架构图展示
一、创建Spring Boot项目
首先,在IDE中创建一个Spring Boot项目,可以使用Spring Initializr(https://start.spring.io/)来生成一个基本的项目结构,也可以使用IDE(如IntelliJ IDEA、Eclipse)自动生成项目。
二、添加依赖
在项目的pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
这里添加了Spring Boot、Spring Security、Spring Data JPA以及MySQL数据库驱动的依赖。
三、创建数据库
在MySQL数据库中创建一个用于存储用户信息的表,可以使用以下DDL语句创建表:
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
四、配置数据库连接
在项目的配置文件(application.properties或application.yml)中配置数据库连接信息,例如:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
这里配置了数据库连接URL、用户名、密码以及数据库驱动等信息。
五、创建实体类和数据访问层
- 创建一个User实体类,用于映射数据库中的user表:
@Entity
@Table(name = "user")
public class User implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
@Column(unique = true)
private String username;
@NotBlank
private String password;
// 省略getter和setter方法
// 实现UserDetails接口的方法
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
- 创建一个UserRepository接口,用于实现对user表的CRUD操作:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
六、配置Spring Security
- 创建一个SecurityConfig类,继承WebSecurityConfigurerAdapter,并使用@EnableWebSecurity注解开启Spring Security的功能:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/register").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/login")
.permitAll();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
- 创建一个UserDetailsServiceImpl类,实现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 user;
}
}
七、创建控制器
- 创建一个UserController类,处理用户的登录、注册等请求:
@Controller
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/login")
public String login() {
return "login";
}
@GetMapping("/register")
public String registerForm() {
return "register";
}
@PostMapping("/register")
public String register(@RequestParam String username, @RequestParam String password) {
userService.register(username, password);
return "redirect:/login";
}
@GetMapping("/home")
public String home() {
return "home";
}
}
- 创建一个UserService类,处理用户的注册逻辑:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
public void register(String username, String password) {
User user = new User();
user.setUsername(username);
user.setPassword(passwordEncoder.encode(password));
userRepository.save(user);
}
}
八、创建视图
- 在templates目录下创建login.html文件,用于登录页面的展示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form action="/login" method="post">
<input type="text" name="username" placeholder="Username" required>
<br>
<input type="password" name="password" placeholder="Password" required>
<br>
<input type="submit" value="Login">
</form>
</body>
</html>
- 在templates目录下创建register.html文件,用于注册页面的展示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Register</title>
</head>
<body>
<h1>Register</h1>
<form action="/register" method="post">
<input type="text" name="username" placeholder="Username" required>
<br>
<input type="password" name="password" placeholder="Password" required>
<br>
<input type="submit" value="Register">
</form>
</body>
</html>
- 在templates目录下创建home.html文件,用于主页的展示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Home</title>
</head>
<body>
<h1>Welcome to Home Page</h1>
</body>
</html>
以上就是使用Spring Boot和Spring Security实现用户登录注册与鉴权的全记录。通过以上步骤,我们成功创建了一个基于Spring Boot和Spring Security的用户登录注册系统,并实现了用户鉴权的功能。根据项目的实际需求,可以进一步扩展和定制Spring Security的功能,以满足更复杂的业务需求。