我对Spring Boot相对较新,并且一直在探索它的身份验证功能.我注意到Spring Boot提供了方便的开箱即用身份验证,前提是用户名和用户_roles表中提供了用户名和角色.然而,我面临着跨两种不同用户类型实现身份验证的挑战,这两种用户类型必须分开并存储在不同的表上,因为它们在我的Spring Boot应用程序中保存了不同类型的数据SQL表.
这是这两个表的收件箱(我知道这些表中没有密码字段或用户名字段,可以稍后添加,我只是想要一个更大的解决方案.)这是乘客表,这是常规身份验证用户.
CREATE TABLE IF NOT EXISTS passengers (
passenger_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
passport_number VARCHAR(15) UNIQUE NOT NULL,
nationality VARCHAR(255) NOT NULL,
contact_details VARCHAR(255)
);
另一个是员工表,它具有管理权限.
CREATE TABLE IF NOT EXISTS employees (
employee_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
role VARCHAR(100) NOT NULL,
contact_info VARCHAR(255),
airport_id INT,
FOREIGN KEY (airport_id) REFERENCES airports(airport_id)
);
所以这是一个我只是为了演示目的而制作的基本示例(这不适用于我在项目中需要的角色).因此,这里我确实需要从两个不同的表中获取不同的用户.我不知道对于这种情况,什么是最佳实践.
@Configuration
public class DemoSecurityConfig {
// add support for JDBC ... no more hardcoded users :-)
@Bean
public UserDetailsManager userDetailsManager(DataSource dataSource) {
JdbcUserDetailsManager jdbcUserDetailsManager = new JdbcUserDetailsManager(dataSource);
// define query to retrieve a user by username
jdbcUserDetailsManager.setUsersByUsernameQuery(
"select user_id, pw, active from members where user_id=?");
// define query to retrieve the authorities/roles by username
jdbcUserDetailsManager.setAuthoritiesByUsernameQuery(
"select user_id, role from roles where user_id=?");
return jdbcUserDetailsManager;
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(configurer ->
configurer
.requestMatchers(HttpMethod.GET, "/api/employees").hasRole("EMPLOYEE")
.requestMatchers(HttpMethod.GET, "/api/employees/**").hasRole("EMPLOYEE")
.requestMatchers(HttpMethod.POST, "/api/employees").hasRole("MANAGER")
.requestMatchers(HttpMethod.PUT, "/api/employees").hasRole("MANAGER")
.requestMatchers(HttpMethod.DELETE, "/api/employees/**").hasRole("ADMIN")
);
// use HTTP Basic authentication
http.httpBasic(Customizer.withDefaults());
// disable Cross Site Request Forgery (CSRF)
// in general, not required for stateless REST APIs that use POST, PUT, DELETE and/or PATCH
http.csrf(csrf -> csrf.disable());
return http.build();
}
}
我一直在考虑仅在另一个用户表和两个表的user_roles表中维护必需的字段.但我想我会遇到另一个问题,即我需要一种类型的用户的数据,并且必须从一个或另一个表中获取.
我们正在使用Spring Data JPA,并为这些表定义了实体.因此,我们拥有扩展JPARepository接口的存储库.有人能否提供指导或潜在的解决方案来在此上下文中实现跨越多个SQL表的身份验证?任何例子或指针都将不胜感激.
提前感谢!