SpringBoot Security从入门到实战示例教程
SpringBoot Security 是一个基于Spring Boot的安全框架,提供了许多安全功能,比如身份验证、授权、攻击防护等。本教程将带你从入门到实战,讲解SpringBoot Security的使用方法。
准备工作
在开始学习SpringBoot Security之前,需要先了解Spring Boot框架的基础知识。同时,需要安装以下软件:
1. JDK 1.8或以上版本
2. Spring Boot 2.0或以上版本
3. Maven 3.2或以上版本
4. IDE(推荐使用IntelliJ IDEA)
创建一个基本的Spring Boot应用程序
让我们首先创建一个简单的Spring Boot应用程序,并添加Spring Boot Security依赖项。
- 在IDE中创建一个新的Spring Boot项目,选择"Maven Project"和"Spring Initializr"。
- 为项目指定一个唯一的groupId和artifactId。
- 添加Spring Boot Security依赖项。在pom.xml文件中添加以下代码
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
- 运行Spring Boot应用程序,访问http://localhost:8080。你需要输入用户名和密码来登录,但由于还没有为应用程序添加任何用户,因此你无法登录。现在让我们添加用户和权限控制
添加用户和权限控制
添加用户和权限控制需要在Spring Security配置类中进行。 Spring Security默认提供了一组认证(Authentication)和授权(Authorization)配置类,我们可以根据需要进行配置修改。以下是一个简单的配置类示例。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user")
.password("{noop}password")
.roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/").permitAll()
.anyRequest().authenticated()
.and()
.formLogin();
}
}
上述代码中,我们将用户的认证信息存储在内存中。用户的用户名为"user",密码为"password",角色为"USER"。在configure方法中,我们配置了访问"/"URL不需要进行身份认证,访问其他的URL需要进行身份认证并且是授权用户才能访问。运行应用程序并访问http://localhost:8080,输入正确的用户名和密码,可以成功登录。如果输入的用户名或密码错误,将无法登录。
实例说明一:使用数据库管理用户
上述示例中我们将用户信息存储在内存中,我们也可以将用户信息存储在数据库中,在此例中我们演示如何使用数据库管理用户。
在我们的应用程序中,我们将使用MySQL数据库来存储用户信息。首先需要在pom.xml文件中添加mysql-connector-java依赖项。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
我们需要创建一个名为"user"的表来存储用户信息。以下是表结构的SQL代码。
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`password` varchar(255) NOT NULL,
`enabled` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
)
在配置文件application.properties中添加以下配置:
spring.datasource.url=jdbc:mysql://localhost:3306/spring_security?characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
在SecurityConfig配置类中,我们可以使用DataSource实例来获取用户信息并进行身份验证。
@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 user WHERE username = ?")
.authoritiesByUsernameQuery("SELECT u.username, r.role FROM user_role ur, user u, role r WHERE u.username = ? AND u.id = ur.user_id AND r.id = ur.role_id");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/").permitAll()
.anyRequest().authenticated()
.and()
.formLogin();
}
}
在上述代码中,我们使用DataSource获取用户信息,也可以使用JdbcTemplate、Hibernate、MyBatis等各种ORM框架来获取用户信息。
实例说明二:限制用户访问权限
除了限制用户访问某些URL之外,还可以限制用户访问不同的HTTP方法。以下是一个例子,限制用户只能使用GET方法访问"/books"URL。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomUserDetailsService userDetailsService;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/books").hasRole("USER")
.antMatchers(HttpMethod.GET, "/books/**").hasRole("USER")
.antMatchers(HttpMethod.POST, "/books/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin();
}
}
在上述代码中,我们使用hasRole方法限制用户访问"books"URL必须具有"USER"角色。而使用HttpMethod.GET不能使用其他HTTP方法访问"/books"URL,否则将被禁止访问。
这里我们介绍了SpringBoot Security的入门到实战知识,使用这个框架能够很好的实现应用程序安全管理,免于安全漏洞的发生。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot Security从入门到实战示例教程 - Python技术站