springboot学生宿舍管理系统多角色登录功能
时间: 2023-10-20 10:16:35 浏览: 46
实现多角色登录功能的一种常见方式是使用Spring Security。Spring Security是基于Spring框架的安全框架,提供了身份认证和授权等安全功能。
以下是实现多角色登录功能的步骤:
1. 添加Spring Security依赖
在pom.xml文件中添加以下依赖:
```
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
```
2. 配置用户角色
在数据库中配置用户信息和角色信息,例如:
```
CREATE TABLE users (
id INT(11) NOT NULL AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
password VARCHAR(100) NOT NULL,
enabled TINYINT(1) NOT NULL DEFAULT 1,
PRIMARY KEY (id),
UNIQUE KEY uk_username (username)
);
CREATE TABLE roles (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY uk_name (name)
);
CREATE TABLE user_roles (
user_id INT(11) NOT NULL,
role_id INT(11) NOT NULL,
PRIMARY KEY (user_id, role_id),
CONSTRAINT fk_user_roles_users FOREIGN KEY (user_id) REFERENCES users (id),
CONSTRAINT fk_user_roles_roles FOREIGN KEY (role_id) REFERENCES roles (id)
);
```
3. 配置Spring Security
创建一个类继承WebSecurityConfigurerAdapter并重写其中的configure方法,例如:
```
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER")
.anyRequest().authenticated()
.and().formLogin().loginPage("/login").permitAll()
.and().logout().permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
```
其中,configure方法用于配置URL的访问权限,例如/admin/**需要ADMIN角色才能访问,/user/**需要USER角色才能访问,其他URL需要身份验证才能访问。configureGlobal方法用于配置用户信息和密码加密方式,例如使用BCryptPasswordEncoder进行密码加密。
4. 实现UserDetailsService接口
创建一个类实现UserDetailsService接口,并重写其中的loadUserByUsername方法,例如:
```
@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(username);
}
List<GrantedAuthority> authorities = new ArrayList<>();
for (Role role : user.getRoles()) {
authorities.add(new SimpleGrantedAuthority(role.getName()));
}
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), user.isEnabled(), true, true, true, authorities);
}
}
```
其中,loadUserByUsername方法根据用户名查询用户信息,并将用户的角色转换为GrantedAuthority对象返回。
5. 实现登录页面
创建一个登录页面,在其中添加用户名和密码的输入框,并将表单的action设置为/login,例如:
```
<form method="post" action="/login">
<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>
<button type="submit">Login</button>
</div>
</form>
```
6. 配置登录成功后的跳转页面
在SecurityConfig中配置登录成功后的跳转页面,例如:
```
@Override
protected void configure(HttpSecurity http) throws Exception {
http
...
.successHandler(new SimpleUrlAuthenticationSuccessHandler("/home"))
...
}
```
其中,SimpleUrlAuthenticationSuccessHandler用于配置登录成功后的跳转页面。
7. 编写控制器
编写控制器处理不同角色的请求,例如:
```
@Controller
@RequestMapping("/admin")
public class AdminController {
@GetMapping("/index")
public String index() {
return "admin/index";
}
}
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/index")
public String index() {
return "user/index";
}
}
```
其中,@RequestMapping注解用于配置URL的映射关系,例如/admin/index映射到AdminController的index方法。
以上就是实现多角色登录功能的步骤,需要注意的是,在UserDetailsService的实现类中,需要将用户信息转换为Spring Security的UserDetails对象返回。另外,需要在数据库中配置用户信息和角色信息,并在SecurityConfig中配置URL的访问权限和登录成功后的跳转页面。