SpringBoot整合SpringSecurity的详细教程
Spring Security是Spring框架家族中的一员,是基于Spring的实现了安全控制的框架。
SpringBoot是一个快速开发的框架,整合SpringSecurity可以让开发者快速实现安全控制功能。
下面我们一步步的来学习如何在SpringBoot中整合SpringSecurity实现安全控制。
1. 引入Spring Security依赖
我们需要在pom.xml
文件中引入Spring Security依赖,代码如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. 配置Spring Security
配置Spring Security可以通过继承WebSecurityConfigurerAdapter
类和重写其中的方法来实现。例如:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll() // 不需要认证的页面
.anyRequest().authenticated() // 其他所有页面都需要认证
.and()
.formLogin()
.loginPage("/login") // 登录页面
.permitAll() // 登录页面不需要认证
.and()
.logout()
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
}
上述代码实现了以下功能:
- 配置了不需要认证的页面
- 配置了需要认证的页面并跳转到登录页面
- 配置了登录页面
- 配置了退出登录
3. 添加自定义登录页面
如果需要使用自己的登录页面,可以通过以下步骤实现:
- 在
application.properties
文件中添加以下配置:
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
- 在
src/main/webapp/WEB-INF
目录下添加jsp
文件夹,并在其中添加login.jsp
文件。 - 修改
SecurityConfig
类的configure()
方法:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login") // 使用自定义的登录页面
.permitAll()
.and()
.logout()
.permitAll();
}
4. 使用数据库存储用户信息
Spring Security默认使用内存来存储用户信息,但是我们也可以使用数据库来存储用户信息。例如:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private DataSource dataSource; // 自动注入DataSource对象
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
String userSql = "SELECT username, password, enabled FROM users WHERE username = ?";
String authoritySql = "SELECT username, authority FROM authorities WHERE username = ?";
auth
.jdbcAuthentication()
.dataSource(dataSource) // 指定数据源
.usersByUsernameQuery(userSql)
.authoritiesByUsernameQuery(authoritySql);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
}
上述代码使用了JdbcAuthentication
来实现,并指定了使用的数据源。同时,我们需要在数据库中创建两张表users
和authorities
来存储用户信息和权限信息。
示例1:使用默认登录页面
使用默认登录页面,代码如下:
@Controller
public class HomeController {
@RequestMapping("/")
public String home() {
return "home";
}
@RequestMapping("/hello")
public String hello() {
return "hello";
}
}
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.permitAll()
.and()
.logout()
.permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
}
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
上述代码中使用了默认的登录页面。
示例2:使用自定义登录页面和数据库存储用户信息
使用自定义登录页面和数据库存储用户信息,代码如下:
@Controller
public class HomeController {
@RequestMapping("/")
public String home() {
return "home";
}
@RequestMapping("/hello")
public String hello() {
return "hello";
}
@RequestMapping("/login")
public String login() {
return "login";
}
}
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private DataSource dataSource;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
String userSql = "SELECT username, password, enabled FROM users WHERE username = ?";
String authoritySql = "SELECT username, authority FROM authorities WHERE username = ?";
auth
.jdbcAuthentication()
.dataSource(dataSource)
.usersByUsernameQuery(userSql)
.authoritiesByUsernameQuery(authoritySql);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
}
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
上述代码中使用了自定义的登录页面和使用数据库存储了用户信息。同时,我们也需要在数据库中创建两张表:users
和authorities
用来存储用户信息和权限信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot整合Spring Security的详细教程 - Python技术站