Spring Security 安全认证的示例代码

关于 Spring Security 安全认证示例代码的完整攻略,我将按照以下步骤来讲解:

  1. 系统需求
  2. Spring Security 简介
  3. Spring Security 安全认证的示例代码
  4. 示例代码的详细解释
  5. 示例的运行方式
  6. 附加示例

1. 系统需求

首先,你需要确保你的系统已经安装了以下环境:

  1. Java 1.8+;
  2. Maven;
  3. Eclipse 或者 IntelliJ IDEA(本例使用 IntelliJ IDEA);
  4. Tomcat。

2. Spring Security 简介

Spring Security 是 Spring 框架的一个子项目,提供一系列的安全认证和授权功能,支持多种认证方式,并能够基于角色来控制用户的访问权限。

3. Spring Security 安全认证的示例代码

示例代码可以在 Github 上找到,地址是:https://github.com/crossoverJie/springboot-security-learning。

4. 示例代码的详细解释

上面的示例代码包含两个示例:

  1. 基于内存的认证示例;
  2. 基于数据库的认证示例。

下面将分别对这两个示例进行详细解释。

4.1 基于内存的认证示例

在这个示例中,我们将使用内存中的用户名和密码进行认证,在示例中有两个用户信息,一个是 admin,密码是 123456,另一个是 crossover,密码是 654321。在示例代码中,我们将这些用户信息写到了一个配置类 InMemorySecurityConfig 中。

示例代码中的 InMemorySecurityConfig 配置类代码如下:

@Configuration
@EnableWebSecurity
public class InMemorySecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").access("hasRole('ADMIN') or hasRole('USER')")
                .anyRequest().authenticated();

        http.formLogin()
                .loginPage("/login")
                .failureUrl("/login?error")
                .usernameParameter("username")
                .passwordParameter("password")
                .defaultSuccessUrl("/home")
                .permitAll()
                .and()
                .logout()
                .logoutSuccessUrl("/login?logout")
                .permitAll();

        // 禁用 CSRF
        http.csrf().disable();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("admin").password("{noop}123456").roles("ADMIN", "USER")
                .and()
                .withUser("crossover").password("{noop}654321").roles("USER");
    }
}

在上面的代码中,我们通过重写 configure 方法来配置安全策略,其中:

  • 第一部分是配置资源访问的权限,如配置访问 /admin/ 的资源必须有角色为 ADMIN 的用户才能访问,访问 /user/ 的资源必须有 ADMIN 或者 USER 的角色才能访问。

  • 第二部分是配置登录和登出行为,其中定义了登录页面的地址为 /login,登录失败后的请求地址是 /login?error,登录成功后默认跳转的地址是 /home,登出请求的地址是 /logout。

  • 第三部分是配置内存信息,使用 inMemoryAuthentication 方法可以创建一个认证信息,包括用户名、密码和角色。

需要注意的是,在示例代码中对密码使用了 >=5.0 版本推荐的 {noop} 模式进行明文存储,这是因为 5.0 版本之后的 Spring Security 默认开启了加密存储密码。

4.2 基于数据库的认证示例

在这个示例中,我们将使用数据库中的用户名和密码进行认证,数据库结构和表的定义如下:

CREATE DATABASE IF NOT EXISTS `test`;
USE `test`;

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `password` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `user` (`username`,`password`) VALUES ('admin','$2a$10$6GJt/5tSxMAVh3SsAyPgbetuGgpYcD2buGSM5PeJUkvp988K10nmy');
INSERT INTO `user` (`username`,`password`) VALUES ('crossover','$2a$10$6GJt/5tSxMAVh3SsAyPgbetuGgpYcD2buGSM5PeJUkvp988K10nmy');

示例代码中的 JdbcSecurityConfig 配置类代码如下:

@Configuration
@EnableWebSecurity
public class JdbcSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication()
                .dataSource(dataSource)
                .usersByUsernameQuery("select username,password,1 as enabled from user where username=?")
                .authoritiesByUsernameQuery("select username, 'ROLE_USER' from user where username=?")
                .passwordEncoder(new BCryptPasswordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .successForwardUrl("/home")
                .and()
                .logout()
                .permitAll();

        // 禁用 CSRF
        http.csrf().disable();
    }
}

在上面的代码中,我们注入了一个 DataSource,用于连接数据库。

在 configureGlobal 方法中,我们使用了 jdbcAuthentication 方法来创建一个认证信息,其中:

  • dataSource 参数用于指定使用的数据源;
  • usersByUsernameQuery 方法用于指定查询用户信息的 SQL 语句;
  • authoritiesByUsernameQuery 方法用于指定查询用户权限信息的 SQL 语句;
  • passwordEncoder 方法用于指定密码编码方式,这里使用了 BCryptPasswordEncoder。

5. 示例的运行方式

在完成代码的编写之后,我们需要将代码打包成 WAR 包并部署到 Tomcat 中运行。具体操作方式如下:

  1. 执行 maven 打包命令,生成 war 包:
mvn clean package
  1. 将生成的 war 包复制到 Tomcat 的 webapps 目录下,并启动 Tomcat 服务:
cd target/
cp springboot-security-1.0-SNAPSHOT.war [TOMCAT_HOME]/webapps/springboot-security.war
cd [TOMCAT_HOME]/bin/
./startup.sh
  1. 访问 http://localhost:8080/springboot-security/login 进行登录。其中,springboot-security 是在 application.properties 中配置的 contextPath。

6. 附加示例

如果你希望使用更加完善的示例,你可以参考以下链接:

https://github.com/wuyouzhuguli/SpringAll/tree/master/30.Spring%20Security

这个示例代码中,提供了使用 Spring Security 实现 OAuth2.0 认证、授权的示例,涉及到了代码鉴权、Token 认证等概念,更加详细全面。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Security 安全认证的示例代码 - Python技术站

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

相关文章

  • Java特性 Lambda 表达式和函数式接口

    Java 8 引入了 lambda 表达式和函数式接口,是 Java 语言中一个重要的特性。本文将介绍 lambda 表达式和函数式接口的基本概念和语法,并分别举出两个示例来说明如何使用它们。 什么是 Lambda 表达式 Lambda 表达式是一种语法糖,它允许我们直接以内联方式为一个函数赋值,即在不创建单独的方法的情况下,使用表达式创建匿名函数,并将其传…

    Java 2023年5月26日
    00
  • java虚拟机学习笔记基础篇

    “Java虚拟机学习笔记基础篇”攻略 简介 “Java虚拟机学习笔记基础篇”是一本深入介绍Java虚拟机的书籍,对于想要深入学习Java的开发者来说非常有用。本攻略将介绍如何有效地阅读和学习这本书。 学习步骤 1. 目录概览 首先,我们需要对书的目录有一个整体的了解。可以逐章浏览目录,熟悉每章的主要内容。在阅读过程中,随时参照目录,掌握学习的大方向。 2. …

    Java 2023年5月23日
    00
  • Java操作mongodb增删改查的基本操作实战指南

    Java操作mongodb增删改查的基本操作实战指南 简介 在Java应用中,使用MongoDB进行数据存储已成为一种常见的方案,MongoDB是一个非关系型的数据库,以文档的形式存储数据。本篇文档将通过示例介绍Java操作MongoDB常见的增、删、改、查基本操作。 准备工作 在开始之前,需要先安装MongoDB和Java驱动包。MongoDB的安装教程可…

    Java 2023年6月1日
    00
  • GitLab+Jenkins+Maven+Tomcat 实现自动集成、打包、部署

    “GitLab+Jenkins+Maven+Tomcat 实现自动集成、打包、部署” 是一个使用开源工具链来实现软件开发流程自动化的典型例子。在本文档中,我们将详细介绍如何将这些工具整合起来,实现自动化集成、打包、部署。 准备工作 GitLab的安装 在你的服务器上安装 GitLab 这个基于 Git 的代码仓库管理系统,并确保它已经正确的配置好了 ssh …

    Java 2023年5月19日
    00
  • 实战讲解Maven安装及基本使用详解

    实战讲解Maven安装及基本使用详解 什么是Maven Maven是一款管理Java项目构建、依赖管理、自动化构建、发布管理的工具,同时也是一个强大的项目管理工具。通过Maven,我们可以明确项目的开发流程,控制项目的质量和构建过程。使用Maven可以大大提高Java项目的开发效率,并且可以帮助我们更好地管理项目所依赖的库。 Maven的安装步骤 下载Mav…

    Java 2023年5月20日
    00
  • Java 互相关联的实体无限递归问题的解决

    为了解决Java中互相关联的实体无限递归问题,需要采用以下方法: 1. 取消循环引用 如果两个实体相互引用,将导致无限递归的问题。可以采用将其中一个实体上的引用取消掉的办法。例如下面这个Java代码示例: public class Person { private List<Person> friends; //其他属性和方法 } 上述代码中,P…

    Java 2023年5月19日
    00
  • SpringBoot 项目瘦身maven/gradle详解

    SpringBoot 项目瘦身 maven/gradle 详解 简介 对于使用 Maven 和 Gradle 构建的 Spring Boot 项目,在打包成 jar 或 war 文件时可能会比较大,占用过多的磁盘空间和运行内存。因此,我们需要对项目进行瘦身,减少不必要的依赖和文件。 本篇文章旨在介绍 Maven 和 Gradle 的瘦身方法,并提供两个示例以…

    Java 2023年6月2日
    00
  • 分析Tomcat的工作原理

    分析Tomcat的工作原理 Tomcat是什么 Tomcat是一个开源的Java Servlet容器,Web服务器软件,由Apache软件基金会开发。它使得Java代码可以在Web服务器上运行,是Web应用程序的开发和部署的重要组件。 工作原理 接收请求 Tomcat通过监听指定端口,侦听客户端请求。当客户端请求到达时,Tomcat会创建一个Socket对象…

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