当前位置: 首页> 科技> 能源 > 合同管理系统_免费推广网站平台排名_网络推广网站公司_百度搜索引擎盘搜搜

合同管理系统_免费推广网站平台排名_网络推广网站公司_百度搜索引擎盘搜搜

时间:2025/7/31 9:21:30来源:https://blog.csdn.net/u010405836/article/details/142111230 浏览次数:1次
合同管理系统_免费推广网站平台排名_网络推广网站公司_百度搜索引擎盘搜搜

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

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

关键字:合同管理系统_免费推广网站平台排名_网络推广网站公司_百度搜索引擎盘搜搜

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: