Java服务端开发中的安全认证:从单点登录到多因子认证的实现

Java服务端开发中的安全认证:从单点登录到多因子认证的实现

大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代Web应用中,安全认证是一个不可或缺的部分,从传统的用户名密码登录到更为复杂的单点登录(SSO)和多因子认证(MFA),我们将详细介绍在Java服务端开发中如何实现这些安全认证机制。

一、单点登录(SSO)

单点登录是一种允许用户通过一个入口登录后访问多个相关但独立的软件系统的机制。这里我们以基于OAuth2协议的Spring Security实现SSO为例。

1. Spring Security OAuth2 SSO配置

首先,引入Spring Security OAuth2依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>

application.yml中配置OAuth2客户端:

spring:security:oauth2:client:registration:juwatech-oauth2-client:client-id: your-client-idclient-secret: your-client-secretscope: read,writeauthorization-grant-type: authorization_coderedirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"provider:juwatech-oauth2-provider:authorization-uri: https://oauth2-provider.com/oauth/authorizetoken-uri: https://oauth2-provider.com/oauth/tokenuser-info-uri: https://oauth2-provider.com/userinfo

然后在Java代码中配置安全:

package cn.juwatech.security;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/login**", "/error**").permitAll().anyRequest().authenticated().and().oauth2Login().userInfoEndpoint().oidcUserService(this.oidcUserService());}@Beanpublic OidcUserService oidcUserService() {return new OidcUserService();}
}

以上配置通过Spring Security和OAuth2客户端实现了简单的SSO。

二、JWT(JSON Web Token)认证

JWT是一种用于声明某些信息的紧凑、自包含的方式。它通常用于API认证。我们使用Spring Security和JWT来实现服务端认证。

1. 引入JWT相关依赖

pom.xml中加入以下依赖:

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

2. 配置JWT生成与验证

编写JwtTokenUtil工具类,用于生成和解析JWT:

package cn.juwatech.security.jwt;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;import java.util.Date;
import java.util.HashMap;
import java.util.Map;@Component
public class JwtTokenUtil {private final String secret = "secretKey"; // 应该保存在环境变量或配置文件中public String generateToken(UserDetails userDetails) {Map<String, Object> claims = new HashMap<>();return createToken(claims, userDetails.getUsername());}private String createToken(Map<String, Object> claims, String subject) {return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis())).setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)).signWith(SignatureAlgorithm.HS256, secret).compact();}public Boolean validateToken(String token, UserDetails userDetails) {final String username = extractUsername(token);return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));}public String extractUsername(String token) {return extractAllClaims(token).getSubject();}private Claims extractAllClaims(String token) {return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();}private Boolean isTokenExpired(String token) {return extractAllClaims(token).getExpiration().before(new Date());}
}

3. 配置安全过滤器

创建一个JWT认证过滤器:

package cn.juwatech.security.jwt;import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@Component
public class JwtRequestFilter extends OncePerRequestFilter {private final UserDetailsService userDetailsService;private final JwtTokenUtil jwtTokenUtil;public JwtRequestFilter(UserDetailsService userDetailsService, JwtTokenUtil jwtTokenUtil) {this.userDetailsService = userDetailsService;this.jwtTokenUtil = jwtTokenUtil;}@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)throws ServletException, IOException {final String authorizationHeader = request.getHeader("Authorization");String username = null;String jwt = null;if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {jwt = authorizationHeader.substring(7);username = jwtTokenUtil.extractUsername(jwt);}if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);if (jwtTokenUtil.validateToken(jwt, userDetails)) {UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken =new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);}}chain.doFilter(request, response);}
}

三、多因子认证(MFA)

多因子认证增加了额外的安全层,如短信验证码或邮件验证。我们将实现一个简单的短信验证码作为第二因子。

1. MFA流程设计

在用户输入用户名和密码后,系统会向用户的手机发送验证码,用户必须输入正确的验证码才能完成登录。

2. 示例代码

package cn.juwatech.security.mfa;import org.springframework.web.bind.annotation.*;import java.util.HashMap;
import java.util.Map;
import java.util.Random;@RestController
@RequestMapping("/mfa")
public class MfaController {private final Map<String, String> otpStorage = new HashMap<>();@PostMapping("/sendOtp")public String sendOtp(@RequestParam String phoneNumber) {String otp = String.valueOf(new Random().nextInt(999999));otpStorage.put(phoneNumber, otp);// 伪代码: 实际应调用短信发送服务System.out.println("Sending OTP " + otp + " to phone number " + phoneNumber);return "OTP sent";}@PostMapping("/validateOtp")public boolean validateOtp(@RequestParam String phoneNumber, @RequestParam String otp) {return otp.equals(otpStorage.get(phoneNumber));}
}

在此实现中,MfaController负责生成和验证短信验证码。在实际应用中,应该集成真正的短信服务提供商。

总结

通过本次讲解,您应该对Java服务端开发中的安全认证机制有了更深的理解。我们从简单的单点登录到复杂的多因子认证,每一步都通过代码实例详细演示了其实现过程。安全认证是保障系统安全性的重要环节,选择合适的认证方式对应用至关重要。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146438.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

HTML粉色烟花秀

目录 系列文章 写在前面 完整代码 代码分析 写在最后 系列文章 序号目录1HTML满屏跳动的爱心&#xff08;可写字&#xff09;2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心&#xff08;简易版&#xff09;7HTML粒子爱心8HTML蓝色…

CSP-J2024年全真模拟题 阅读程序篇2

因为明天考试&#xff0c;这回给大家准备了超详细的解析~ 22.程序中 n 和 m 只有输入正整数&#xff0c;程序的输出值才可能是 YES A.对B.错 23.程序中用到了递归函数 bool fun&#xff08;int n&#xff09; A.对B.错 24.若输入 n 和 m 都是素数&#xff0c;程序的输出值…

powerbi- l6-获取文件的动态链接

需求&#xff1a; 需要对文件夹中的文件进行处理处理的文件名包含当天的日期&#xff0c;格式为年月日 在powerbi 中打开高级编辑&#xff0c;将文件夹的名称中动态内容进行修改&#xff0c;按照如下的格式&#xff0c; 比如文件名为&#xff1a;fixed_name_20240930_abc.pdf…

生活小助手系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;客户管理&#xff0c;社区公告管理&#xff0c;反馈信息管理&#xff0c;生活缴费处管理&#xff0c;物品分类管理&#xff0c;二手物品管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统…

股指期权交易详细基础介绍

股指期权是期权市场中的一种特定类型&#xff0c;其标的资产为股票指数。简而言之&#xff0c;它允许投资者在未来某个特定时间&#xff0c;以预先约定的价格&#xff0c;买入或卖出股票指数的权利。在中国&#xff0c;已上市的股指期权包括上证50、沪深300和中证1000股指期权&…

Yocto - 使用Yocto开发嵌入式Linux系统_02 认识 Yocto 项目

Meeting the Yocto Project 本章向你介绍 Yocto 项目。这里讨论的项目主要概念将贯穿全书。此外&#xff0c;我们还将简要讨论 Yocto 项目的历史、OpenEmbedded、Poky、BitBake、元数据和版本模式。系好安全带&#xff0c;欢迎加入我们的行列&#xff01; This chapter introdu…

NC65客开常见问题以及解决方案

NC65客开常见问题以及解决方案 元数据实体对应的数据库表没有创建&#xff1a; 参照发布元数据第三步&#xff0c;生成数据库表 元数据名称和字段名称不一致导致报错: 更改为一致&#xff0c;删除原有的数据库表&#xff0c;重新生成数据库表并且重新发布元数据&#xff08;如…

【Qt之·文件操作·类QTextStream、QDataStream】

系列文章目录 文章目录 前言一、概述1.1 QTextStream类1.2 QTextStream类的作用和用途 二、基本用法2.1 QTextStream成员函数2.2 QTextStream格式描述符、描述符方法2.3 QDataStream成员函数2.4 创建QTextStream对象并关联输入/输出设备&#xff08;如文件、标准输入/输出流等&…

34. 模型材质父类Material

学习到现在大家对threejs的材质都有简单的了解&#xff0c;本节课主要结合文档&#xff0c;从JavaScript语法角度&#xff0c;给大家总结一下材质API的语法。 材质父类Material 查询threejs文档&#xff0c;你可以看到基础网格材质MeshBasicMaterial、漫反射网格材质MeshLamb…

C语言中的一些小知识(三)

一、你了解printf()吗&#xff1f; 你知道下面代码的输出结果吗&#xff1f; int a123; printf("%2d \n",a); printf() 函数是 C 语言中用于格式化输出的标准函数&#xff0c;它允许你将数据以特定的格式输出到标准输出设备&#xff08;通常是屏幕&#xff09;。p…

中电信翼康基于Apache Dolphinscheduler重构“星海·济世医疗数据中台”实践经验分享

文章作者&#xff1a;尚志忠 编辑整理&#xff1a;曾辉 行业背景 随着大数据、云计算、5G、人工智能等技术的快速发展&#xff0c;以及医疗信息化建设的不断深入&#xff0c;数据中台作为打通医疗数据融合壁垒、实现数据互通与共享、构建高效数据应用的关键信息平台&#xf…

松材线虫目标检测数据集,12522张图-纯手工标注

松材线虫目标检测数据集&#xff0c;12522张图像&#xff0c;专家纯手工标注。 松材线虫目标检测数据集 数据集描述 该数据集是一个专门用于松材线虫&#xff08;Bursaphelenchus xylophilus&#xff09;检测的数据集&#xff0c;旨在帮助研究人员和开发者训练和评估基于深度…

Python 操作 Arduino 入门

本文翻译整理自&#xff1a;Arduino With Python: How to Get Started https://realpython.com/arduino-python/ 文章目录 一、Arduino平台1、Arduino硬件2、Arduino软件 二、“Hello, World!”与Arduino1、上传眨眼示例草图2、连接外部组件3、使用面包板 三、“Hello, World!”…

技术美术百人计划 | 《5.1.1 PBR-基于物理的材质》笔记

1. PBR定义-基于物理的材质 PBR&#xff0c;或者用更通俗一些的称呼是指基于物理的渲染(Physically Based Rendering)&#xff0c;它指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合。 正因为基于物理的渲染目的便是为了使用一种更…

利用Metasploit进行信息收集与扫描

Metasploit之信息收集和扫描 在本文中&#xff0c;我们将学习以下内容 使用Metasploit被动收集信息 使用Metasploit主动收集信息 使用Nmap进行端口扫描 使用db_nmap方式进行端口扫描 使用ARP进行主机发现 UDP服务探测 SMB扫描和枚举 SSH版本扫描 FTP扫描 SMTP枚举 …

关于机器学习和深度学习的区别有哪些?

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于机器学习和深度学习区别的相关内容&…

Jboss CVE-2017-7504 靶场攻略

漏洞介绍 JBoss AS 4.x及之前版本中&#xff0c;JbossMQ实现过程的JMS over HTTP Invocation Layer的 HTTPServerILServlet.java⽂件存在反序列化漏洞&#xff0c;远程攻击者可借助特制的序列化数据利⽤该漏洞执⾏ 任意代码执⾏ 影响范围 JBoss 4.x 以及之前的所有版本 环…

对接阿里asr和Azure asr

1&#xff1a;对接阿里asr 1.1&#xff1a;pom <dependency><groupId>com.alibaba.nls</groupId><artifactId>nls-sdk-recognizer</artifactId><version>2.2.1</version> </dependency>1.2&#xff1a;生成token package c…

Springboot 文件上传下载相关问题

文章目录 关于Springboot 文件上传下载问题解决方案注意事项文件上传文件下载文件删除文件在线打开在写练习的时候&#xff0c;发现了一些小小的问题&#xff0c;已经在 上述代码中体现。① 代码路径碰到中文的时候&#xff0c;会有乱码&#xff0c;需要转换&#xff08;内容中…

fanuc添加地轨步骤图

机器人选项J518 法兰盘选择 FLANGE TYPE SELECT1 一般 机器人类型选择 TYPE SETTING2 J1运动范围设置 机器人->控制启动