详解Spring Security的formLogin登录认证模式

yizhihongxing

详解Spring Security的formLogin登录认证模式

概述

在使用Spring Security开发Web应用的过程中,我们通常需要用户进行身份验证和授权,而Spring Security的formLogin登录认证模式就是其中一种。formLogin认证模式是指用户将会通过一个用户名和密码的表单来进行身份验证。这个过程中,用户在浏览器中访问了一个需要身份验证的页面,但是他们还没有登陆,于是Spring Security自动跳转到一个默认的登录页面(也可以自定义登录页面),并且在用户输入用户名和密码之后进行身份验证。如果验证成功,用户可以访问需要权限的资源,否则将被重定向到错误页面。

使用步骤

下面将会介绍使用formLogin登录认证模式的步骤:

引入Spring Security依赖

在项目的依赖中加入Spring Security的依赖:

<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-web</artifactId>
  <version>5.3.2.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-config</artifactId>
  <version>5.3.2.RELEASE</version>
</dependency>

配置Spring Security

在Spring Security的配置文件中,需要做如下配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

  @Autowired
  private DataSource dataSource;

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
        .antMatchers("/", "/home").permitAll()
        .anyRequest().authenticated()
        .and()
        .formLogin()
          .loginPage("/login")
          .defaultSuccessUrl("/home")
          .permitAll()
        .and()
        .logout()
          .logoutUrl("/logout")
          .logoutSuccessUrl("/login?logout")
          .invalidateHttpSession(true)
          .permitAll();
  }

  @Override
  public void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.jdbcAuthentication().dataSource(dataSource)
        .usersByUsernameQuery("select username,password,enabled from users where username=?")
        .authoritiesByUsernameQuery("select username,authority from authorities where username=?");
  }
}

在上面的配置中,我们定义了需要进行身份验证和授权的页面以及用户的角色和权限。

创建自定义登录页面

如果需要提供一个个性化的登录页面,可以按照如下步骤进行设置:

在Controller中添加以下代码:

@GetMapping("/login")
public String loginPage(){
    return "login";
}

在resources/templates目录下新建login.html页面,添加以下代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login Page</title>
</head>
<body>
<h2>Login Page</h2>
<form action="/login" method="post">
    <p>
        <label>Username:</label>
        <input type="text" name="username"/>
    </p>

    <p>
        <label>Password:</label>
        <input type="password" name="password"/>
    </p>

    <button type="submit">Login</button>
</form>
</body>
</html>

添加用户信息到数据库

首先需要新建两张表,分别保存用户和权限信息:

CREATE TABLE users (
    username varchar(50) not null primary key,
    password varchar(100) not null,
    enabled boolean not null
);

CREATE TABLE authorities (
    username varchar(50) not null,
    authority varchar(50) not null,
    foreign key (username) references users (username)
);

然后插入相应的用户和权限信息:

INSERT INTO users (username,password,enabled) values ('admin','$2a$10$wZRpm94xxWOxJfzy9vwrFOfSdeaoFPAZS9PL.GPEa/gELrOHBzHYW',true);
INSERT INTO USERS (username,password,enabled) values ('user','$2a$10$6tjRQ5tDnoR1ITHcu9l8g.8Ea56F.o7WT.VoieL9D8FiL1S/bajli',true);
INSERT INTO authorities (username,authority) values ('admin','ROLE_ADMIN');
INSERT INTO authorities (username,authority) values ('user','ROLE_USER');
INSERT INTO authorities (username,authority) values ('admin','ROLE_USER');

其中的密码都是使用BCrypt加密,可以使用BCryptPasswordEncoder进行加密。

这里给出的密码是:

admin -> admin

user -> user

运行示例

この操作在示例中运行,构建了一个使用Spring Security formLogin模式进行身份验证的Web应用。其中包含了两张表,一张保存用户信息,一张保存权限信息。每个用户都可以分配多个权限,不同的用户可以访问不同的页面。简单起见,该示例中没有涉及到使用HTTPS。

1. Build and Run

首先,使用下面的命令编译并运行示例:

mvn clean package spring-boot:run

运行成功后,可以通过浏览器访问(http://localhost:8080/)。

2. Login

客户端可以在生成的登陆页面,通过使用上面提到的用户名和密码进行登陆。(管理员用户:admin / admin;普通用户:user / user)。

3. Access

成功登陆之后,我们就能够在不同的URL中对其进行相应的测试:

http://localhost:8080/home

总结

上述是使用Spring Security的formLogin登录认证模式的详细介绍。通过正确使用此模式,我们可以轻松地向我们的Web应用程序添加身份验证和授权用户的功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Spring Security的formLogin登录认证模式 - Python技术站

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

相关文章

  • 各种格式的编码解码工具类分享(hex解码 base64编码)

    各种格式的编码解码工具类分享 1. hex解码工具类 Hex是一种用16进制表示二进制数据的编码方式,我们可以通过Hex解码工具将16进制字符串转换成二进制数据。 以下是实现Hex解码的代码示例: public class HexUtil { /* * 将16进制字符串转换为byte数组 */ public static byte[] hex2Bytes(S…

    Java 2023年5月20日
    00
  • JAVA实现caesar凯撒加密算法

    下面是“JAVA实现Caesar凯撒加密算法”的完整攻略: 凯撒加密算法简介 Caesar凯撒加密算法是最常见、最简单的加密算法之一,它是一种替换加密的方式,即用字母表中某个固定数目的后续字母来替换原文中的字母。例如,当加密密钥为3时,所有的字母都会向后移位三个位置,即A变为D,B变为E,以此类推。解密则是反向移动相同的位数。 Java实现Caesar凯撒加…

    Java 2023年5月19日
    00
  • IDEA2022创建Maven Web项目教程(图文)

    以下是“IDEA2022创建Maven Web项目教程(图文)”的完整攻略: IDEA2022创建Maven Web项目教程(图文) 在开始之前,请确保你已经安装了Maven和IntelliJ IDEA 2022。 步骤一:创建Maven Web项目 打开IntelliJ IDEA,点击“File”菜单,选择“New” – “Project ”。 在弹出的窗…

    Java 2023年6月2日
    00
  • 如何简单使用mybatis注解

    下面我来详细讲解如何简单使用mybatis注解。 1. 引入mybatis注解依赖 首先在项目中引入mybatis注解依赖,例如: <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <ver…

    Java 2023年5月20日
    00
  • Java多线程编程中使用DateFormat类

    在Java多线程编程中,DateFormat类是常用的日期格式化类。本篇攻略将详细讲解如何在多线程环境中正确使用DateFormat类。 为什么要使用DateFormat类 在Java编程中,处理日期时间是一个常见的需求。格式化Date对象为字符串、解析字符串为Date对象等都需要用到日期格式化类。DateFormat类是一种线程不安全的类,因为DateFo…

    Java 2023年5月18日
    00
  • 面向对象编程依赖注入详解

    面向对象编程依赖注入详解 什么是依赖注入 依赖注入(Dependency Injection,简称DI)是一种在面向对象编程中,将类间依赖关系的创建和管理权交给其他专门的类来处理的技术。通俗的说,就是让调用类摆脱创建和管理被调用类对象的束缚,将创建和管理依赖对象的工作交给容器来完成。 DI的优点 降低了系统模块间的耦合度。 可以提高模块的可重用性、可测试性和…

    Java 2023年5月26日
    00
  • SpringBoot原生组件注入实现两种方式介绍

    Spring Boot是一个快速开发框架,它提供了很多便捷的功能,其中之一就是组件注入。在Spring Boot中,我们可以使用两种方式来实现组件注入,分别是构造函数注入和属性注入。本文将详细讲解这两种方式的实现方法,包括以下内容: 构造函数注入的实现方法 属性注入的实现方法 示例一:使用构造函数注入 示例二:使用属性注入 1. 构造函数注入的实现方法 构造…

    Java 2023年5月15日
    00
  • Java如何获取Date的“昨天”与“明天”示例代码

    获取Date的“昨天”与“明天”可以通过以下步骤实现: 步骤一:获取当前日期 首先,我们需要获取当前的日期。Java中可以使用java.util.Date类来表示日期时间。可以通过new Date()方法获取到当前的日期: Date today = new Date(); 步骤二:计算“昨天” 要计算“昨天”,我们需要通过java.util.Calendar…

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