SpringBoot + SpringSecurity 环境搭建的步骤

让我来详细讲解一下SpringBoot和SpringSecurity环境搭建的步骤。

步骤一:创建SpringBoot项目

首先我们需要创建一个SpringBoot项目。如果你已经有了一个SpringBoot项目,你可以跳过这个步骤。

在创建项目时,我们需要选择Spring Web、Spring Security和Thymeleaf这三个依赖。示例代码如下:

<dependencies>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-security</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-thymeleaf</artifactId>
   </dependency>
</dependencies>

步骤二:配置SpringSecurity

在SpringBoot中,我们可以使用注解来配置SpringSecurity。我们只需要在一个类上面加上注解@EnableWebSecurity,就可以开启SpringSecurity的自动配置了。

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/css/**", "/index").permitAll()
            .antMatchers("/user/**").hasRole("USER")
            .and()
            .formLogin().loginPage("/login").failureUrl("/login-error");
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password("password").roles("USER");
    }
}

在这里我们配置了两个URL模式的访问规则,一个是针对/css/**/index路径的访问,它们可以被所有访问者访问;另一个是针对/user/**路径的访问,它只能被拥有USER角色的用户访问。我们还设置了一个自定义的登录页/login,和一个登录失败者跳转到的URL,这个URL将会在用户输入错误的用户名或密码时被使用。

我们还需要配置一个AuthenticationManagerBuilder来生成一个用户,让SpringSecurity在内存中保存这个用户。在这个例子中,我们创建的是一个名为“user”的用户,他的密码是“password”,并且他的角色是USER。

步骤三:创建登录页和主页

现在,我们需要创建一个登录页面来让用户输入用户名和密码。这里我使用了Thymeleaf模板引擎来创建一个HTML页面,并将它放置在templates目录下的一个名为login.html的文件中。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8" />
    <title>Login Page</title>
    <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}" />
</head>
<body>
    <div class="container">
        <div th:if="${param.error}">
            Invalid username or password.
        </div>
        <div th:if="${param.logout}">
            You have been logged out.
        </div>
        <form th:action="@{/login}" method="post">
            <div class="form-group">
                <label for="username">Username:</label>
                <input type="text" id="username" name="username" class="form-control" />
            </div>

            <div class="form-group">
                <label for="password">Password:</label>
                <input type="password" id="password" name="password" class="form-control" />
            </div>

            <button type="submit" class="btn btn-default">Login</button>
        </form>
    </div>
</body>
</html>

上面的代码中,我们使用了Thymeleaf的语法来生成HTML代码,包含了一个登录表单和两个div标签。在这个界面中,如果你输入错误的用户名或密码,将会在页面上显示“Invalid username or password.”,如果你成功退出登录,页面上会显示“You have been logged out.”

我们还需要创建一个主页,让拥有USER角色的用户可以访问。这里我创建了一个home.html文件,把它放置在templates目录下。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8" />
    <title>Home Page</title>
    <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}" />
</head>
<body>
    <h1>Welcome Home!</h1>
</body>
</html>

步骤四:运行项目并测试

最后一步是运行你的SpringBoot应用程序,然后试图访问路径

http://localhost:8080/

你会被重定向到登录页面。输入用户名“user”和密码“password”,然后点击“Login”按钮。给SpringSecurity一点时间来验证你的登录信息,你最终应该会被重定向到一个名为“home”的页面。

示例说明

示例一:自定义登录URL和验证失败URL

在步骤二中,我们自定义了登录页的URL和验证失败后跳转的URL。如果你想要自定义它们,你只需要在WebSecurityConfig类中的configure()方法中添加以下代码:

@Override
protected void configure(HttpSecurity http) throws Exception {
   // 设置登录页面
   http.formLogin().loginPage("/login-custom")
      // 配置验证失败跳转的页面
      .failureUrl("/login-custom?error=true");
}

示例二:使用数据库进行权限验证

默认情况下,Spring Security 使用内存进行用户认证。但是,在实际的生产环境中,我们很少使用内存来保存认证和授权信息。因此,我们通常会使用数据库或LDAP来保存这些信息。

如果你想要使用数据库进行权限验证,你需要做的是:

  • 定义一个数据表,保存用户的认证信息和授权信息。
  • 配置一个UserDetailsService,用于从数据库中检索用户的认证信息和授权信息。
  • 在WebSecurityConfig类中使用userDetailsService()方法来配置这个UserDetailsService。

示例代码:

@Autowired
DataSource dataSource;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth.jdbcAuthentication().dataSource(dataSource)
        .usersByUsernameQuery("SELECT username, password, enabled FROM users WHERE username=?")
        .authoritiesByUsernameQuery("SELECT username, role FROM user_roles WHERE username=?");
}

在这里,我们使用了一个名为“users”的表来存储用户信息,使用了一个名为“user_roles”的表来存储用户角色信息。我们还通过dataSource()方法来配置了一个用于读取数据库的数据源。在内部,Spring Security 的 JDBC认证机制将会执行两个查询语句:一个用于验证用户的用户名和密码,另一个用于获取用户的角色。这两个查询语句都会返回一个ResultSet对象,其中包含了用户的信息。

以上就是使用SpringBoot和SpringSecurity进行权限验证的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot + SpringSecurity 环境搭建的步骤 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Java从控制台读入数据的几种方法总结

    下面是“Java从控制台读入数据的几种方法总结”的完整攻略。 一、从控制台读入数据的几种方法 在Java中,可以通过以下几种方式从控制台读入数据: 使用Scanner类读入用户输入数据。 使用BufferedReader类读入用户输入数据。 使用System.in.read()方法读入用户输入的字符。 下面我们将分别详细说明这三种方法的具体使用。 1. 使用…

    Java 2023年5月26日
    00
  • 不让tomcat显示目录文件列表的配置方法

    下面是详细的攻略: 什么是目录文件列表 在访问一个网页时,如果该网页所在的目录中含有多个文件,那么当我们没有明确指定要访问的文件时(比如访问一个目录时),服务器会默认返回一个该目录下所有文件的列表。这个列表就被称为目录文件列表,它通常会列出每个文件的名称、文件尺寸、修改时间等信息。 在一些情况下,我们可能希望禁止服务器显示目录文件列表,因为它有可能会暴露我们…

    Java 2023年6月15日
    00
  • Java 事务详解及简单应用实例

    关于“Java 事务详解及简单应用实例”的完整攻略,下面我撰写一些内容,希望能够对您有所帮助。 Java 事务详解及简单应用实例 什么是事务 事务(Transaction)是指一个或多个操作组成的一个不可分割的执行单元。事务是数据库操作中的一个重要概念,它使得用户可以将多个操作看作一个整体完成,而不必担心它们之间的相互影响。 在Java中,事务必须在支持事务…

    Java 2023年5月19日
    00
  • 详解json在SpringBoot中的格式转换

    下面详细讲解“详解json在SpringBoot中的格式转换”的完整攻略。 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,通常用于前后端数据交互。它基于JavaScript语言中的对象字面量表示法,而且易于读写和解析生成,被广泛应用于Web开发中。 JSON实际上就是一个字符串,它使用键值对的方式…

    Java 2023年5月26日
    00
  • 简单易懂的java8新特性之lambda表达式知识总结

    简单易懂的Java8新特性之Lambda表达式知识总结 Java8的Lambda表达式是一个非常强大的语言特性,它可以让Java代码更加简单、易读和易维护。本攻略将从以下几个方面详细讲解Java8中的Lambda表达式。 Lambda表达式是什么? Lambda表达式是一个匿名函数,它可以在不定义方法的情况下声明和使用。Lambda表达式通常用于Java中的…

    Java 2023年5月26日
    00
  • MySQL 处理大数据表的 3 种方案,写的太好了,建议收藏!!

    作者:马佩 链接:https://juejin.cn/post/7146016771936354312 场景 当我们业务数据库表中的数据越来越多,如果你也和我遇到了以下类似场景,那让我们一起来解决这个问题 数据的插入,查询时长较长 后续业务需求的扩展 在表中新增字段 影响较大 表中的数据并不是所有的都为有效数据 需求只查询时间区间内的 评估表数据体量 我们可…

    Java 2023年4月17日
    00
  • Java编程利用socket多线程访问服务器文件代码示例

    下面我将详细讲解“Java编程利用socket多线程访问服务器文件代码示例”的完整攻略。 确定需求 首先,我们需要清楚自己的需求,即要实现什么功能。在这个示例中,我们需要实现通过 socket 多线程访问服务器文件,因此我们需要确定以下内容: 客户端程序需要向服务器请求文件 服务器端需要提供对请求文件的响应 使用 socket 进行通信 使用多线程实现并发访…

    Java 2023年5月18日
    00
  • Java 数据结构与算法系列精讲之背包问题

    Java 数据结构与算法系列精讲之背包问题 背包问题简介 背包问题是计算机科学中的经典问题,旨在找到最佳的物品组合,使得其总重量不超过背包容量,同时总价值最大化。背包问题有多个变体,每个变体都采用不同的解决方法。 01背包 01背包指的是背包容量固定,并且每个物品只有一个的情况。对于n个物品和一个容量为V的背包,每个物品有两个属性:体积w和价值v。该问题可以…

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