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日

相关文章

  • Spring session 获取当前账户登录数的实例代码

    Spring Session 是 Spring 提供的用于在分布式系统中管理用户会话信息的解决方案。通过使用 Spring Session,我们可以将用户的会话信息存储在外部存储中,实现会话状态在多个应用之间的共享,从而解决多个应用之间无法共享会话状态的问题。 在 Spring Session 中,我们可以使用 SessionRegistry 接口来获取当前…

    Java 2023年6月16日
    00
  • java时间戳与日期相互转换工具详解

    Java时间戳与日期相互转换工具详解 在Java中,时间戳(timestamp)是指自1970年1月1日00:00:00以来所经过的毫秒数。而日期(date)则是表示具体年月日的数据类型。在开发中,我们常常需要进行时间戳和日期之间的转换。下面是详细的转换方法。 时间戳转日期 Java中可以通过java.util.Date类将时间戳转换为日期类型,具体代码如下…

    Java 2023年5月20日
    00
  • Springmvc异常处理器及拦截器实现代码

    当我们在使用SpringMVC框架进行开发的时候,我们希望在程序运行中出现异常的时候能够进行处理,这时候就需要用到SpringMVC的异常处理器和拦截器。下面是实现这两个功能的代码: SpringMVC异常处理器的实现 首先在SpringMVC配置文件中配置SimpleMappingExceptionResolver,它可以捕获所有未处理的异常,并将它们映射…

    Java 2023年5月27日
    00
  • gaussdb 200安装 data studio jdbc idea链接保姆级安装步骤

    下面是详细的 “gaussdb 200安装 data studio jdbc idea链接保姆级安装步骤”攻略: 准备工作 首先需要从官网下载并安装GaussDB 200数据库软件; 安装Java开发环境,假设你已经安装了Java环境,那么请确认你的Java版本号,因为后续需要使用JDBC链接数据库,而不同版本的jdbc驱动有差异; 安装Intellij I…

    Java 2023年6月16日
    00
  • 详解Java实现分治算法

    详解Java实现分治算法 分治算法是一种很重要的算法思想,它具有很高的实用性和普遍性。在本文中,我们将详细讲解如何使用Java实现分治算法,帮助大家更加深入地理解分治算法的实现过程。 什么是分治算法 分治算法指的是将一个大问题拆分成若干个相似的小问题,最终通过合并小问题的解来解决大问题的方法。分治算法一般包括三个步骤: 分解原问题为若干个子问题; 解决每个子…

    Java 2023年5月18日
    00
  • Java中String的split切割字符串方法实例及扩展

    Java中String的split切割字符串方法实例及扩展 在Java中,字符串是非常重要的一种数据类型,字符串的操作也是非常常见的。其中字符串的切割操作是一种常用的操作,Java中提供了split方法来进行字符串的切割操作。下面将详细介绍Java中String的split方法实例及扩展。 什么是split方法? Java中String类的split方法是将…

    Java 2023年5月26日
    00
  • Java生成随机时间的简单随机算法

    下面是关于Java生成随机时间的简单随机算法的完整攻略。 1. 生成随机时间 生成随机时间的核心是生成随机的小时、分钟、秒、毫秒等,然后将这些时间组合起来构成一个新的日期时间对象。 1.1 生成随机小时数 使用Java的Random类可以生成随机的小时数。例如: Random random = new Random(); int hour = random.…

    Java 2023年5月20日
    00
  • 使用IDEA创建servlet JavaWeb 应用及使用Tomcat本地部署的实现

    下面详细讲解如何使用IntelliJ IDEA创建servlet JavaWeb应用以及如何使用Tomcat进行本地部署的完整攻略。 创建servlet JavaWeb 应用 下面是在IntelliJ IDEA中创建Servlet JavaWeb应用的步骤: 打开IntelliJ IDEA,选择 File > New > Project,选择Ja…

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