asp网站源码 怎么安装,深圳做网站收费,长沙景点有哪些,网站运营服务中心建设方案Web应用中#xff0c;用户认证与授权是至关重要的功能#xff0c;确保只有合法用户才能访问受保护的资源。Spring Security作为一个强大的安全框架#xff0c;支持多种认证与授权方式。在本章节中#xff0c;我们将深入探讨三种常见的用户认证与授权方案#xff1a;基于To…Web应用中用户认证与授权是至关重要的功能确保只有合法用户才能访问受保护的资源。Spring Security作为一个强大的安全框架支持多种认证与授权方式。在本章节中我们将深入探讨三种常见的用户认证与授权方案基于Token的用户认证JWT、OAuth2认证与授权以及使用Spring Security与OAuth2实现社交登录。 1. 实现基于Token的用户认证JWT
1.1 什么是JWT
JWTJSON Web Token是一种基于Token的认证机制广泛应用于分布式系统中。它通常由三部分组成
Header通常包含Token类型和加密算法的信息。Payload包含用户的身份信息及相关的元数据如角色。Signature用于验证JWT的真实性通常使用秘钥进行加密。
JWT的优势在于它是无状态的也就是说服务器不需要存储会话信息所有信息都包含在JWT中。这使得它非常适用于微服务架构和分布式系统。
1.2 JWT认证流程
用户登录时提交用户名和密码。服务器验证用户信息通过验证后生成JWT。将JWT返回给客户端客户端保存Token。客户端在后续请求中将Token附加在HTTP请求的Authorization头部中服务器通过解密Token来验证用户身份。
1.3 使用Spring Boot实现JWT认证
添加依赖
在pom.xml中添加JWT相关依赖
dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactIdversion0.11.5/version
/dependency
生成JWT的工具类
创建一个JWT生成工具类用于生成和解析JWT。
Component
public class JwtTokenUtil {private String secretKey secret; // 秘钥应该放在配置文件中private long expirationTime 86400000L; // 过期时间24小时// 生成JWTpublic String generateToken(String username) {Date now new Date();Date expiryDate new Date(now.getTime() expirationTime);return Jwts.builder().setSubject(username).setIssuedAt(now).setExpiration(expiryDate).signWith(SignatureAlgorithm.HS512, secretKey).compact();}// 从JWT中解析出用户名public String getUsernameFromToken(String token) {return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody().getSubject();}// 验证JWT是否有效public boolean validateToken(String token, String username) {String parsedUsername getUsernameFromToken(token);return (parsedUsername.equals(username) !isTokenExpired(token));}// 判断JWT是否过期private boolean isTokenExpired(String token) {Date expiration Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody().getExpiration();return expiration.before(new Date());}
}
认证过滤器
创建一个过滤器用于在每个请求中验证JWT。
Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {Autowiredprivate JwtTokenUtil jwtTokenUtil;Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {String token request.getHeader(Authorization);if (token ! null token.startsWith(Bearer )) {token token.substring(7);String username jwtTokenUtil.getUsernameFromToken(token);if (username ! null SecurityContextHolder.getContext().getAuthentication() null) {UsernamePasswordAuthenticationToken authentication new UsernamePasswordAuthenticationToken(username, null, new ArrayList());SecurityContextHolder.getContext().setAuthentication(authentication);}}filterChain.doFilter(request, response);}
}
用户认证与生成Token
在用户登录时生成JWT并返回给客户端。
RestController
public class AuthController {Autowiredprivate JwtTokenUtil jwtTokenUtil;PostMapping(/login)public ResponseEntity? createAuthenticationToken(RequestBody AuthenticationRequest authenticationRequest) {// 验证用户身份if (user.equals(authenticationRequest.getUsername()) password.equals(authenticationRequest.getPassword())) {String token jwtTokenUtil.generateToken(authenticationRequest.getUsername());return ResponseEntity.ok(new AuthenticationResponse(token));}return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(Invalid credentials);}
}
1.4 保护资源
在需要保护的资源上使用PreAuthorize或Secured注解来进行权限控制。
RestController
RequestMapping(/admin)
public class AdminController {GetMapping(/dashboard)PreAuthorize(hasRole(ADMIN))public String getAdminDashboard() {return Admin Dashboard;}
} 2. 配置OAuth2认证与授权
2.1 什么是OAuth2
OAuth2是一个授权框架用于让第三方应用访问用户资源而无需暴露用户的用户名和密码。OAuth2通过授权码、密码、客户端凭证等不同方式来获取Token常见的应用场景包括社交登录和API访问。
2.2 配置OAuth2认证
在Spring Boot中OAuth2认证可以通过spring-security-oauth2-client和spring-security-oauth2-jose等库来配置。
添加依赖
在pom.xml中添加OAuth2的相关依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-oauth2-client/artifactId
/dependency
配置application.yml
在application.yml中配置OAuth2客户端信息如以下示例配置Google OAuth2登录
spring:security:oauth2:client:registration:google:client-id: YOUR_GOOGLE_CLIENT_IDclient-secret: YOUR_GOOGLE_CLIENT_SECRETscope:- profile- emailredirect-uri: {baseUrl}/login/oauth2/code/{registrationId}authorization-grant-type: authorization_codeclient-name: Googleprovider:google:authorization-uri: https://accounts.google.com/o/oauth2/authtoken-uri: https://oauth2.googleapis.com/tokenuser-info-uri: https://www.googleapis.com/oauth2/v3/userinfo
OAuth2登录处理
Spring Boot自动处理OAuth2登录过程。您只需配置相关的OAuth2提供商如Google、GitHub等并在应用中使用EnableOAuth2Sso注解来开启社交登录。
SpringBootApplication
EnableOAuth2Sso
public class OAuth2Application {public static void main(String[] args) {SpringApplication.run(OAuth2Application.class, args);}
} 3. 使用Spring Security与OAuth2实现社交登录
3.1 社交登录简介
社交登录Social Login是指通过已有的社交媒体账户如Google、Facebook、GitHub等进行身份验证的方式。通过OAuth2协议用户无需在每个应用中注册单独的账户只需使用现有的社交账户登录。
3.2 配置社交登录
配置第三方OAuth2登录
以GitHub为例在application.yml中配置GitHub OAuth2客户端
spring:security:oauth2:client:registration:github:client-id: YOUR_GITHUB_CLIENT_IDclient-secret: YOUR_GITHUB_CLIENT_SECRETscope: read:userredirect-uri: {baseUrl}/login/oauth2/code/{registrationId}authorization-grant-type: authorization_codeclient-name: GitHubprovider:github:authorization-uri: https://github.com/login/oauth/authorizetoken-uri: https://github.com/login/oauth/access_tokenuser-info-uri: https://api.github.com/user
自定义用户信息
在OAuth2UserService中您可以自定义如何从OAuth2提供商获取用户信息。
Service
public class CustomOAuth2UserService extends DefaultOAuth2UserService {Overridepublic OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {OAuth2User user super.loadUser(userRequest);// 在此可以从user中获取用户信息并存储到数据库return user;}
}
社交登录成功后的回调处理
使用Spring Security的默认OAuth2登录机制用户登录成功后会自动跳转到指定的成功页面您可以在SecurityConfig中自定义成功和失败的处理
Configuration
EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {http.oauth2Login().loginPage(/login).successHandler(new OAuth2LoginSuccessHandler()).failureHandler(new OAuth2LoginFailureHandler());}
}
3.3 完成社交登录
通过以上配置您已经成功集成了OAuth2社交登录支持用户通过Google、GitHub等社交账户进行登录。 总结
本文详细介绍了基于Token的用户认证JWT、OAuth2认证与授权的配置与实现以及如何使用Spring Security与OAuth2实现社交登录。通过这些技术我们可以实现灵活且安全的认证与授权机制并有效地支持分布式应用和微服务架构中的用户管理。 关于作者
15年互联网开发、带过10-20人的团队多次帮助公司从0到1完成项目开发在TX等大厂都工作过。当下为退役状态写此篇文章属个人爱好。本人开发期间收集了很多开发课程等资料需要可联系我