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

详解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日

相关文章

  • JSP输出HTML时产生的大量空格和换行的去除方法

    请看下面的完整攻略: JSP输出HTML时产生的大量空格和换行的去除方法 在JSP中输出HTML代码时,由于JSP代码与HTML代码的交错使用,很容易产生大量的空格和换行,这会导致HTML页面的体积增大,加载速度变慢,同时也不符合优化的要求。因此,我们需要对JSP输出HTML的过程进行优化,去除这些空格和换行。 下面是两种去除JSP输出HTML空格和换行的方…

    Java 2023年6月15日
    00
  • Java对象的四种引用方式实例分析

    Java对象的四种引用方式实例分析 在Java中,对象的引用方式可以分为四种:强引用、软引用、弱引用和虚引用。每种引用方式有其特定的应用场景和特点。下面将详细介绍每一种引用方式以及其使用示例。 强引用 强引用是Java中最常用的引用方式。定义一个对象并将其赋值给一个引用变量时,这个引用变量就是强引用。只要强引用存在,对象就不会被垃圾回收机制回收。 例如:定义…

    Java 2023年5月26日
    00
  • 深入JAVA对象深度克隆的详解

    深入JAVA对象深度克隆的详解 对象深度克隆是指克隆一个对象及其子对象,同时新对象与原对象是互不干扰的,对新对象的任何修改都不会影响原对象。在Java中,实现对象深克隆通常使用“序列化”和“反序列化”技术。本篇文章将详细讲解如何实现Java对象的深度克隆。 实现Java对象深度克隆 方法一:序列化与反序列化实现克隆 序列化对象可以用ObjectOutputS…

    Java 2023年5月26日
    00
  • 修改Tomcat运行时jvm编码问题

    下面是修改Tomcat运行时jvm编码问题的完整攻略: 1. 了解Tomcat jvm编码问题 Tomcat是一个开源的Web应用服务器,使用Java语言编写,可以运行Java Web应用程序。在使用Tomcat时,我们有时会遇到在Tomcat运行时出现乱码的问题,这是由于Tomcat运行时jvm编码设置不正确所导致的。 jvm是Java Virtual M…

    Java 2023年5月20日
    00
  • java Beanutils.copyProperties( )用法详解

    Java BeanUtils.copyProperties()用法详解 BeanUtils.copyProperties()是Apache Commons BeanUtils库中提供的一个方法,它可以将一个Java Bean的属性值拷贝到另一个Java Bean中。该方法提供了一个方便的方式来将两个不同对象之间的属性值进行复制。 方法签名 以下是BeanUt…

    Java 2023年5月20日
    00
  • java开发之基于Validator接口的SpringMVC数据校验方式

    一、什么是Validator接口 Validator 接口是 Spring Framework 里面的一组校验接口,它实现了数据的校验功能。当我们在使用 SpringMVC 框架开发 web 项目时,需要进行表单数据的校验。为了降低代码复杂度和提高代码的可读性和可维护性,我们可以使用 Validator 接口对表单数据进行校验。 二、使用 Validator…

    Java 2023年5月20日
    00
  • java面试常见问题之Hibernate总结

    我来详细讲解“Java面试常见问题之Hibernate总结”的完整攻略。 简介 Hibernate是Java平台上的一个ORM框架,它提供了高效、灵活的对象/关系映射解决方案,能够很好地解决Java应用程序中对象持久化的问题。由于Hibernate的应用非常广泛,因此,在Java的面试中也经常会被问及Hibernate相关的问题。 Hibernate常见问题…

    Java 2023年5月20日
    00
  • SpringBoot整合MyBatis逆向工程及 MyBatis通用Mapper实例详解

    介绍 本文从零开始讲解SpringBoot整合MyBatis逆向工程及MyBatis通用Mapper的详细步骤和示例代码。MyBatis是一款优秀的ORM框架,通过逆向工程可以将关系型数据库的表结构生成对应的Java Bean,以及相关的Mapper和XML映射文件,以减少开发量。而MyBatis通用Mapper可以进一步提高开发效率,省去了大量的Mappe…

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