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面向对象之多态

    Java面向对象之多态 Java是一门面向对象的编程语言,其中最重要的特性之一就是多态。多态是指同一个方法或者同一个类,在不同的时间、不同的对象上具有不同的表现形式。下面我们来仔细分析Java中的多态。 引言 Java的多态性分为静态多态和动态多态。 静态多态性是指在编译期就可以确定方法的调用对象,也就是说,在程序编译时已经确定了将要调用的方法。在Java中…

    Java 2023年5月26日
    00
  • Eclipse配置Tomcat和JDK步骤图解

    下面是Eclipse配置Tomcat和JDK的详细攻略: 步骤一:下载和安装JDK并设置环境变量 前往Oracle官网下载JDK安装包并安装; 新建系统环境变量JAVA_HOME,值为JDK的安装路径; 在系统环境变量中,找到Path,添加%JAVA_HOME%\bin路径。 步骤二:下载Tomcat并在Eclipse中安装 前往Tomcat官网下载最新版本…

    Java 2023年5月19日
    00
  • 如何在vue项目中嵌入jsp页面的方法(2种)

    在 Vue 项目中嵌入 JSP 页面可以通过以下两种方法实现: 方法一:使用 iframe 标签嵌入 JSP 页面 可以使用 iframe 标签嵌入 JSP 页面,使用方法如下: 在 Vue 组件中使用 iframe 标签,并设置 src 属性为 JSP 页面的地址。 <template> <div class="jsp-page…

    Java 2023年6月15日
    00
  • 从零开始让你的Spring Boot项目跑在Linux服务器

    下面是从零开始让你的Spring Boot项目跑在Linux服务器的完整攻略。 一、准备工作1. 购买一台Linux服务器,获取root权限。2. 安装Java环境,可以使用yum安装或手动下载安装。 二、打包Spring Boot项目打包Spring Boot项目,生成可执行的jar包。使用以下命令进行打包: mvn package 三、上传jar包到服务…

    Java 2023年6月2日
    00
  • java字节字符转换流操作详解

    Java字节字符转换流操作详解 什么是Java字节字符转换流? Java字节字符转换流是Java I/O API中的一种高级流(也叫过滤流或处理流),用于在字节流和字符流之间进行转换。在Java中,通常使用字节流来处理二进制数据文件、图像文件和音频文件等等,而使用字符流来处理文本文件。但是在实际开发中,我们可能需要将字节流转换成字符流或将字符流转换成字节流。…

    Java 2023年5月20日
    00
  • 非常不错的[JS]Cookie精通之路

    “非常不错的[JS]Cookie精通之路”攻略 什么是 Cookie Cookie是一种用于跟踪网站访问者并存储其首选项的技术。它是由服务器发送给客户端(即浏览器)的小文本文件。该文件由客户端存储,并在每次请求该网站时发送回服务器。Cookie通常用于存储用户的会话ID、购物车数据、用户首选项等信息。 创建 Cookie 在JavaScript中,使用doc…

    Java 2023年6月15日
    00
  • Java线程池的几种实现方法和区别介绍实例详解

    Java线程池的几种实现方法和区别介绍 什么是线程池 在线程池中,线程的创建和销毁都由线程池管理器来处理,线程池中包括一组线程,线程池会根据配置的参数来动态调整线程池中线程的数量。线程池中的线程可以被多个任务共享,使线程的创建和销毁开销及竞争锁等问题得以优化。 为什么要使用线程池 线程池的主要目的是为了控制并发执行的线程数,有以下几个优点: 降低线程的创建和…

    Java 2023年5月18日
    00
  • Java内存模型的作用是什么?

    Java内存模型定义了Java程序中不同线程的内存访问行为和相互作用。它的作用是确保线程之间的可见性、原子性和有序性,提供一种可靠的线程同步机制。 在Java程序中,内存访问操作被划分为读操作和写操作。Java内存模型通过定义一系列规则来约束这些操作,确保它们在多线程环境下的顺序和可见性。以下是Java内存模型的重要特性: 原子性:对于单个的变量读/写具有原…

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