springboot登录模块
时间: 2023-09-05 07:13:22 浏览: 86
用springboot+shiro+jwt写的简单的登录模块
Spring Boot登录模块可以使用Spring Security来实现。Spring Security是一个强大的安全框架,可以提供基于角色的权限管理、用户认证和授权等功能。
以下是使用Spring Security实现登录模块的步骤:
1. 添加Spring Security依赖
在pom.xml文件中添加以下依赖:
```
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
```
2. 配置Spring Security
在Spring Boot应用程序中,可以通过配置类来配置Spring Security。例如:
```
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
}
@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();
}
}
```
上面的配置类中,我们使用了@EnableWebSecurity注解来启用Spring Security,并继承了WebSecurityConfigurerAdapter类来覆盖默认的Spring Security配置。
在configure方法中,我们配置了用户认证和授权的方式。其中,userDetailsService是一个接口,用于加载用户信息。passwordEncoder是一个接口,用于加密用户密码。
在configure方法的另一个重载中,我们配置了登录页面、成功登录后跳转的页面和注销页面的访问权限。
3. 创建登录页面
在Spring Boot应用程序中,可以使用Thymeleaf等模板引擎来创建页面。例如:
```
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form th:action="@{/login}" method="post">
<div>
<label for="username">Username:</label>
<input type="text" id="username" name="username"/>
</div>
<div>
<label for="password">Password:</label>
<input type="password" id="password" name="password"/>
</div>
<div>
<input type="submit" value="Login"/>
</div>
</form>
</body>
</html>
```
4. 创建用户认证服务
在Spring Boot应用程序中,可以通过实现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(), getAuthorities(user));
}
private Collection<? extends GrantedAuthority> getAuthorities(User user) {
List<GrantedAuthority> authorities = new ArrayList<>();
user.getRoles().forEach(role -> {
authorities.add(new SimpleGrantedAuthority("ROLE_" + role.getName()));
});
return authorities;
}
}
```
上面的代码中,我们实现了loadUserByUsername方法来查找用户信息。在该方法中,我们从userRepository中查找用户信息,并返回一个UserDetails对象。该对象包括用户名、密码和角色信息等。
5. 创建用户实体类
在Spring Boot应用程序中,可以创建一个User实体类来表示用户信息。例如:
```
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>();
// getters and setters
}
```
上面的代码中,我们使用@Entity注解来指示这是一个JPA实体类。该类包含了用户名、密码和角色信息等。其中,@ManyToMany注解用于表示用户和角色之间是多对多关系。
6. 创建角色实体类
在Spring Boot应用程序中,可以创建一个Role实体类来表示角色信息。例如:
```
@Entity
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// getters and setters
}
```
上面的代码中,我们使用@Entity注解来指示这是一个JPA实体类。该类包含了角色名称等信息。
7. 创建用户和角色之间的关系表
在Spring Boot应用程序中,可以创建一个user_role表来表示用户和角色之间的关系。例如:
```
CREATE TABLE user_role (
user_id BIGINT NOT NULL,
role_id BIGINT NOT NULL,
PRIMARY KEY (user_id, role_id),
FOREIGN KEY (user_id) REFERENCES user (id),
FOREIGN KEY (role_id) REFERENCES role (id)
);
```
上面的SQL语句中,我们创建了一个名为user_role的表,该表包含了user_id和role_id两个字段。这两个字段分别表示用户ID和角色ID。同时,我们使用了FOREIGN KEY约束来确保user_id和role_id分别引用了user表和role表的主键。
8. 创建用户和角色的Repository
在Spring Boot应用程序中,可以创建一个UserRepository和RoleRepository分别用于操作用户和角色信息。例如:
```
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
public interface RoleRepository extends JpaRepository<Role, Long> {
Role findByName(String name);
}
```
上面的代码中,我们使用了JpaRepository接口来操作用户和角色信息。其中,findByUsername和findByName方法用于根据用户名和角色名称查找对应的用户和角色信息。
9. 测试登录模块
在完成以上步骤后,我们就可以测试登录模块了。访问登录页面时,系统会自动跳转到Spring Security默认的登录页面。在该页面中,输入正确的用户名和密码后,系统会跳转到默认的成功登录页面。在该页面中,我们可以显示当前用户的信息或者实现其他功能。
阅读全文