关键词

SpringBoot整合Spring Security的详细教程

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来实现,并指定了使用的数据源。同时,我们需要在数据库中创建两张表usersauthorities来存储用户信息和权限信息。

示例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);
    }

}

上述代码中使用了自定义的登录页面和使用数据库存储了用户信息。同时,我们也需要在数据库中创建两张表:usersauthorities用来存储用户信息和权限信息。

本文链接:http://task.lmcjl.com/news/8017.html

展开阅读全文