下面是详解Spring Security怎么从数据库加载我们的用户的完整攻略。
准备工作
首先,我们需要在项目中引入Spring Security和Spring JDBC的依赖。具体可以在maven中添加如下依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.4.2</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.4.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
配置Spring Security
我们需要创建一个配置类,以便配置Spring Security。在配置类中,我们需要完成对用户和角色的定义、对加密算法的配置以及对请求的拦截配置。
定义用户和角色
我们可以通过如下方式定义一个用户和一个角色:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private DataSource dataSource;
@Override
protected 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=?")
.passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
其中,我们通过auth.jdbcAuthentication()
来开启从数据库加载用户的功能,设置数据源为我们配置的dataSource
,并指定了从数据库中查询用户信息以及角色信息的SQL语句。同时,我们也配置了一个PasswordEncoder
对象,以便对密码进行加密操作。
配置请求的拦截
我们可以通过如下方式配置请求的拦截规则:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private DataSource dataSource;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").authenticated()
.antMatchers("/public/**").permitAll()
.and()
.formLogin()
.and()
.logout();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// ...
}
@Bean
public PasswordEncoder passwordEncoder() {
// ...
}
}
其中,我们通过.authorizeRequests()
方法来开启请求的拦截配置,然后通过.antMatchers()
方法来配置不同请求的拦截规则。对于每个匹配到的拦截规则,我们通过.hasRole()
或.authenticated()
方法来指定需要的角色或需要进行身份验证。最后,我们通过.formLogin()
和.logout()
方法来配置表单登录和退出登录功能。
两个示例
接下来,我们给出两个示例,用来展示如何在Spring Security中从数据库加载用户信息。
示例一:在MySQL中存储用户信息
在这个示例中,我们将用户信息存储在MySQL中。
首先,我们首先需要创建一个包含用户信息的表。我们可以通过如下SQL语句来创建这个表:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(255) NOT NULL,
`enabled` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
然后,我们需要创建一个包含用户角色信息的表。我们可以通过如下SQL语句来创建这个表:
CREATE TABLE `authorities` (
`username` varchar(50) NOT NULL,
`authority` varchar(50) NOT NULL,
PRIMARY KEY (`username`,`authority`),
CONSTRAINT `authorities_ibfk_1` FOREIGN KEY (`username`) REFERENCES `users` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
接着,我们需要在我们的配置文件中配置MySQL的数据库连接信息:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
最后,我们需要编写一个启动类来启动我们的Spring Boot应用程序:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
在这个示例中,我们从MySQL中加载用户信息,然后使用BCrypt算法进行密码加密。同时,我们还通过HTTP Basic进行了安全控制。
示例二:在PostgreSQL中存储用户信息
在这个示例中,我们将用户信息存储在PostgreSQL中。
首先,我们首先需要创建一个包含用户信息和角色信息的表。我们可以通过如下SQL语句来创建这个表:
CREATE TABLE users (
username VARCHAR(50) PRIMARY KEY NOT NULL,
password VARCHAR(100) NOT NULL,
enabled BOOLEAN NOT NULL
);
CREATE TABLE authorities (
username VARCHAR(50) NOT NULL,
authority VARCHAR(50) NOT NULL,
CONSTRAINT fk_authorities_users FOREIGN KEY(username) REFERENCES users(username)
);
然后,我们需要在我们的配置文件中配置PostgreSQL的数据库连接信息:
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=postgres
spring.datasource.password=123456
最后,我们需要编写一个启动类来启动我们的Spring Boot应用程序:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
在这个示例中,我们从PostgreSQL中加载用户信息,然后使用BCrypt算法进行密码加密。同时,我们还通过HTTP Basic进行了安全控制。
总结
这篇攻略介绍了如何通过Spring Security从数据库中加载用户信息。我们给出了详细的配置和示例,希望能够对你理解Spring Security有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Spring Security怎么从数据库加载我们的用户 - Python技术站