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日

相关文章

  • JavaWeb Listener 利用Session统计在线人数

    下面我将详细讲解“JavaWeb Listener 利用Session统计在线人数”的完整攻略。 什么是Listener Listener 是 JavaWeb 中的一种组件,用于监听某一种事件的发生,并在适当的时候做出反应。常用的一些监听器有 ServletContextListener、HttpSessionListener、ServletRequestL…

    Java 2023年6月15日
    00
  • java Spring Boot 配置redis pom文件操作

    Java Spring Boot 是一个快速开发应用程序的框架,而 Redis 是一个基于内存存储的数据结构存储系统。在 Spring Boot 应用程序中,我们可以配置 Redis,以便有效地管理数据。 以下是配置 Redis 的 pom 文件操作的完整攻略: 步骤1:引入 Redis 依赖项 在 pom.xml 文件中添加以下代码: <depend…

    Java 2023年5月20日
    00
  • Mybatis非配置原因,导致SqlSession was not registered for synchronization异常

    “Mybatis非配置原因,导致SqlSession was not registered for synchronization异常”是一个在Mybatis框架中常见的异常错误。具体原因可能是以下几个方面: 事务管理器没有配置正确; 对于Spring + Mybatis的项目,没有将SqlSession交给Spring容器管理; 没有正确使用Mybatis…

    Java 2023年5月19日
    00
  • Maven Web项目使用Cargo插件实现自动化部署的详细步骤

    针对这个话题,我将会给出一份完整的攻略,详细介绍Maven Web项目使用Cargo插件实现自动化部署的步骤。下面将会分为以下几个部分进行讲解: Cargo插件简介 Maven Web项目使用Cargo插件的实现步骤 Cargo插件配置文件详解 示例一:将Web应用部署到Tomcat服务器 示例二:将Web应用部署到WildFly服务器 下面我们就来一步步讲…

    Java 2023年5月19日
    00
  • javaweb在线支付功能实现代码

    下面是“javaweb在线支付功能实现代码”的完整攻略。 确定支付方式和接口 首先需要确定网站支持哪些支付方式,例如支付宝、微信支付等,然后根据支付方式找到相应的支付接口,例如支付宝的即时到账接口或者微信支付的统一下单接口。 创建订单 在用户确认需要支付时,需要创建对应的订单并保存到数据库中。订单包含以下信息: 订单号:唯一标识该订单 商品名称:用户购买的商…

    Java 2023年6月15日
    00
  • IDEA基于支付宝小程序搭建springboot项目的详细步骤

    下面是“IDEA基于支付宝小程序搭建springboot项目的详细步骤”的完整攻略。 步骤一:下载安装开发环境 首先需要下载并安装以下开发工具: IDEA:用于Java项目开发的集成开发环境。 JDK:Java开发工具包,用于编译和运行Java代码。 支付宝小程序开发工具:用于开发和调试小程序的工具。 步骤二:创建Spring Boot项目 在IDEA中创建…

    Java 2023年5月19日
    00
  • java如何判断一个数是否是素数(质数)

    判断一个数是否是素数是一个常见的算法问题,下面是用java编写的实现方法: 1.判断算法 判断一个数x是否为素数的方法是判断x是否能被2~sqrt(x)范围内的整数整除。如果有一个数能够整除x,那么x就不是素数,否则x就是素数。 示例代码: public static boolean isPrime(int x) { if (x < 2) { // 小…

    Java 2023年5月26日
    00
  • javascript基于原型链的继承及call和apply函数用法分析

    JavaScript基于原型链的继承 什么是继承 在面向对象编程中,继承是一种允许新对象获取现有对象的属性和方法的机制。它允许我们创建继承现有对象的新对象,从而减少代码重复,增加代码可重用性。 JavaScript中基于原型链的继承 在JavaScript中,没有像其他语言一样的类和接口的概念,继承通过原型链来实现。每个对象都有一个原型对象,原型对象又有自己…

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