创建一个新的Spring Security应用程序,并使用JDBC连接数据库
在这个教程中,我们将学习如何创建一个新的Spring Security应用程序,使用JDBC连接数据库以获取用户信息并进行认证。我们还将学习如何配置Spring Security以从数据库中获取用户和权限信息,并使其与不同的模式和数据源一起工作。
1. 初始化Spring Boot项目
首先,我们需要创建一个新的Spring Boot项目。可以通过访问 start.spring.io 并设置组名和项目名来完成。选择以下依赖项:
Spring Web Starter
Spring Security Starter
H2 Database(用于本视频中的内存数据库)
JDBC API(用于与数据库交互)
2. 创建HomeResource类
创建一个HomeResource类,并在其中定义几个API端点:
/home:公开的端点,任何人都可以访问
/user:仅用户或管理员可以访问
/admin:仅管理员可以访问
@RestController
public class HomeResource {@GetMapping("/")public String home() {return "Welcome to the home page!";}@GetMapping("/user")public String user() {return "Welcome to the user page!";}@GetMapping("/admin")public String admin() {return "Welcome to the admin page!";}
}
- 配置Spring Security
创建一个SecurityConfiguration类,扩展WebSecurityConfigurerAdapter,以配置认证和授权。
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {@AutowiredDataSource dataSource;@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.jdbcAuthentication().dataSource(dataSource).usersByUsernameQuery("select username, password, enabled from users where username = ?").authoritiesByUsernameQuery("select username, authority from authorities where username = ?");}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin").hasRole("ADMIN").antMatchers("/user").hasAnyRole("USER", "ADMIN").antMatchers("/").permitAll().and().formLogin();}@Beanpublic PasswordEncoder passwordEncoder() {return NoOpPasswordEncoder.getInstance();}
}
- 配置数据库和数据源
在application.properties中配置H2数据库和JDBC连接:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.h2.console.enabled=true
spring.datasource.initialization-mode=always
5. 创建数据库模式和初始化数据
在src/main/resources目录下创建schema.sql和data.sql文件,分别定义数据库模式和初始化数据。
schema.sql:在这里插入代码片
CREATE TABLE users (username VARCHAR(50) NOT NULL PRIMARY KEY,password VARCHAR(50) NOT NULL,enabled BOOLEAN NOT NULL
);CREATE TABLE authorities (username VARCHAR(50) NOT NULL,authority VARCHAR(50) NOT NULL,FOREIGN KEY (username) REFERENCES users(username)
);CREATE UNIQUE INDEX ix_auth_username ON authorities (username, authority);
data.sql:
INSERT INTO users (username, password, enabled) VALUES ('user', 'pass', true);
INSERT INTO users (username, password, enabled) VALUES ('admin', 'pass', true);INSERT INTO authorities (username, authority) VALUES ('user', 'ROLE_USER');
INSERT INTO authorities (username, authority) VALUES ('admin', 'ROLE_ADMIN');
6. 启动应用并测试
启动应用并访问不同的端点:
访问/,任何人都可以访问
访问/user,需要用户或管理员角色
访问/admin,需要管理员角色
输入相应的用户名和密码进行测试,例如user/pass和admin/pass。
结论
通过以上步骤,我们创建了一个使用Spring Security和JDBC进行用户认证的Spring Boot应用程序。我们还学习了如何配置数据库和数据源,以及如何初始化数据库模式和数据。在实际应用中,可以使用类似的方法连接到外部数据库,并根据需要调整数据库模式和数据源配置。