Spring Security 安全认证的示例代码

yizhihongxing

关于 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 定时器的多种实现方式

    Java 定时器的多种实现方式 前言 在 Java 开发中,我们经常需要编写定时任务,如定时备份、定时发送消息等。这些任务需要在指定时间点或时间间隔内执行。而实现这些定时任务的方法有多种,本文将一一介绍这些方式,包括 Java 内置定时器、定时线程池、Quartz 框架以及 Spring 自带的定时任务。 Java 内置定时器 Java 内置了一个 Time…

    Java 2023年5月18日
    00
  • Java 实战项目之疫情人员流动管理系统详解

    Java 实战项目之疫情人员流动管理系统详解 什么是疫情人员流动管理系统? 疫情人员流动管理系统是一种可以管理和跟踪疫情期间人员流动的系统,它可以记录人员的基本信息、行程信息和健康情况等,并能够根据这些信息做出对应的管理和应对措施。该系统可以帮助政府和社区及时掌握疫情人员的相关情况,从而有效地减缓疫情的传播。 开发该系统需要掌握的技能和工具 Java 编程语…

    Java 2023年5月31日
    00
  • Springboot与Maven多环境配置的解决方案

    下面我来详细讲解“Spring Boot与Maven多环境配置的解决方案”的完整攻略。 方案概述 在进行软件开发的过程中,不同的环境往往需要使用不同的配置,例如本地开发环境、测试环境、生产环境等。而Spring Boot作为一个快速开发的框架,在开发过程中需要使用到一些配置,例如数据库连接信息、端口号等。因此需要进行多环境配置的支持。 Maven是一个常用的…

    Java 2023年5月19日
    00
  • java实现简单的学生管理系统

    Java实现简单的学生管理系统 系统概述 本系统主要用于实现学生的增删查改功能,通过控制台输入进行操作,界面简单,操作方便。 系统架构 代码采用Java语言实现,采用MVC模式进行设计。其中,Model层主要负责数据存储与业务逻辑;View层主要负责展示数据和接受用户输入;Controller层主要负责控制Model和View的交互,实现对Model层数据的…

    Java 2023年5月18日
    00
  • 使用MyBatis进行简单的更新与查询方式

    MyBatis是一个优秀的ORM框架,提供了简单、快速的SQL实现方式。下面将详细讲解使用MyBatis进行简单的更新与查询方式的完整攻略。 1. 简单更新操作 MyBatis可以通过Mapper XML文件直接实现对数据的更新操作。以下是一个执行基本的更新SQL的示例: <!– Mapper XML文件 –> <update id=&…

    Java 2023年5月19日
    00
  • Java Web 实现QQ登录功能一个帐号同一时间只能一个人登录

    实现Java Web QQ登录功能并限制同一帐号只能一个人登录的过程主要可以分为以下几个步骤: 步骤一:QQ登录API的接入 1.申请QQ登录的APP ID和APP Key,并获取到回调URL2.在Web应用程序中添加QQ登录API的SDK3.配置QQ登录API的SDK,包括APP ID,APP Key和回调URL 具体的接入方法可以参照官方的开发文档:ht…

    Java 2023年6月16日
    00
  • Java线程的6种状态及切换教程

    Java线程的6种状态及切换教程 Java是一种多线程编程语言,线程作为Java应用程序的基本执行单元,线程状态经常改变。正因为Java线程状态的改变,在多线程程序中使用线程,需要了解线程的6种状态及状态转换。本文将通过以下几个方面详细讲解Java线程的6种状态及状态转换的教程。 Java线程的6种状态 Java线程共有6种状态,分别是: NEW(新建):线…

    Java 2023年5月18日
    00
  • Java线程代码的实现方法

    下面是详细讲解“Java线程代码的实现方法”的完整攻略。 一、Java线程实现方法 Java中实现线程的方法主要有两种:继承Thread类和实现Runnable接口。两种方法各有优缺点,以下分别进行介绍。 1. 继承Thread类 继承Thread类是实现Java线程的较为简单的方法。继承Thread类后重写run()方法,将run()方法中需要线程执行的代…

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