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用来存储用户信息和权限信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot整合Spring Security的详细教程 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • java调用webservice的.asmx接口的使用步骤

    Java调用WebService的ASMX接口的使用步骤如下: 步骤1:生成Java类在Java调用WebService接口之前,我们需要先生成Java类用于调用WebService。在传统的方式中,我们需要使用wsimport工具来生成Java类,如下所示: wsimport -d . -keep http://localhost:8080/xxx?wsd…

    Java 2023年5月19日
    00
  • Spring切面优先级与基于xml的AOP实现方法详解

    Spring切面优先级与基于XML的AOP实现方法详解 在Spring中,切面是一种用于横切关注点的模块化方式。切面可以定义在XML文件中,也可以使用注解方式定义。本文将详细讲解Spring切面优先级和基于XML的AOP实现方法。 1. Spring切面优先级 在Spring中,切面的优先级是由切面的顺序决定的。切面的顺序可以通过实现Ordered接口或使用…

    Java 2023年5月18日
    00
  • Java Object类和包装类深入解读

    Java Object类和包装类深入解读 Java中的所有类继承自Object类,这使得Object类成为Java中最基础的类之一。此外,Java中还包含了8个基本数据类型,这些基本数据类型都有其对应的包装类,用来对基本类型进行装箱操作,使其具备对象的特征。本文将深入探讨Java中Object类和包装类的相关知识点和用法。 Object类 什么是Object…

    Java 2023年5月26日
    00
  • 浅谈用SpringBoot实现策略模式

    下面我将详细讲解如何用SpringBoot实现策略模式。 策略模式简介 策略模式是一种行为设计模式,它使得我们可以在运行时从一组算法中选择其中一种算法,并将其应用到特定的场景中。策略模式主要由三种角色组成: Context(上下文):主要负责接收客户端的请求,并将请求委托给具体的策略对象进行处理。 Strategy(策略):定义所有具体策略类必须实现的接口/…

    Java 2023年5月15日
    00
  • JSP导出Excel文件的方法

    JSP导出Excel文件是一种常见的需求,在这里给出一个JSP导出Excel文件的完整攻略。 1. 准备工作 首先需要引入先关依赖。 jxl.jar (可从网络上下载):jxl是一款专门用于处理Excel文件的java类库,其中包含了读取和写入Excel文件等相关操作。 2. 导出Excel文件的主要过程 (1)定义数据集并填充数据 首先,我们需要定义一个要…

    Java 2023年6月15日
    00
  • Java实现简单树结构

    下面我来详细讲解“Java实现简单树结构”的完整攻略。 什么是树结构? 树结构是一种经典的数据结构,它是由节点和边组成的层次结构。树结构中有一个顶点叫做根节点,其他节点则称作子节点。树结构具有以下特点: 根节点没有父节点; 每个节点都可能有若干个子节点; 除了根节点外,每个节点都有唯一一个父节点; 如果一个节点没有子节点,我们称其为叶节点。 如何实现树结构?…

    Java 2023年5月18日
    00
  • ASP 隐藏下载地址及防盗链代码

    ASP 隐藏下载地址及防盗链代码的完整攻略包括以下几个步骤: 1.隐藏下载地址 假设需要隐藏的下载地址为:http://example.com/download/file.zip首先,将下载链接修改为动态地址,并添加一个参数,参数的值为一个随机数或者时间戳等字符串,比如: http://example.com/download.asp?file=file.z…

    Java 2023年6月16日
    00
  • Java正则表达式API字符类

    Java正则表达式API字符类 在 Java 的正则表达式中,字符类是一种用于匹配某个范围内字符的元字符集合。它可以轻松地匹配需要的字符类型。 语法 字符类使用方括号 [] 来定义。其中,方括号内可以包含一系列要匹配的字符或字符范围。 例如,匹配 a、b、c、d、e、f、g 这七个字符的字符类可以写为: [a-g] 该字符类代表范围从 “a” 到 “g” 的…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部