有什么地方不正确或者缺少了某些知识请及时告诉我,感谢。
单点登录(SSO)是一种用户身份验证过程,允许用户使用单一的登录凭据来访问多个应用程序或服务。它减少了需要记忆多个用户名和密码的需求,提高了安全性和用户体验。SSO在企业环境中尤为重要,因为它简化了对多个内部和外部服务的访问过程。
使用Google账号登录各种服务。例如,你可以用Google账号登录Gmail,然后不需要再次登录就能访问Google Drive、Google Photos、YouTube等Google服务。这种方式让用户无需记住多个账号和密码,提供了便捷和高效的用户体验。
授权登录,如OAuth,是一种允许应用程序或服务在不共享用户的登录凭证的情况下,安全地访问用户在其他服务上的数据的协议。它为第三方应用提供了有限的访问权限,通常用于社交媒体登录、数据共享等场景。这种方法提高了数据安全性,同时也方便了用户和服务之间的数据交互。
一个常见的授权登录示例是使用社交媒体账号登录其他服务或应用。例如,很多网站和应用允许你使用Facebook或Google账号登录。当你选择这种登录方式时,网站会引导你到Facebook或Google的登录页面。在这里,你需要授权该网站访问你的某些社交媒体信息(如基本资料)。一旦授权,你就可以使用社交媒体账号在新网站上登录,而无需创建新的账户。这种方式简化了登录流程,同时保护了你的密码安全,因为你的社交媒体登录信息不会被第三方网站获取。
单点登录与授权登录是分开的两套业务,但是可以配合使用,比如,Google Mail 首次登录时,需要使用Google账号授权登录Google Mail,但是登录之后,Google旗下的YouTube、Google Cloud等服务均无需登录(处于已登录状态),这就是配合使用的情况。 目前国内的腾讯旗下几乎所有站点,都采用的是QQ授权登录,网易我尝试了一下,163官网与网易账户中心是SSO,其余都是账号密码登录。
为什么会诞生SSO这种业务呢,主要就是为了方便用户,当一个企业的业务站点过多的时候,用户每一个业务都去注册、登录,无疑会给用户带来体验上的阻碍,而此时,如果使用一种登录一个网站其余网站均为登录状态的技术,这样可以极大的优化用户的体验,无需重复的注册账户和输入密码。 但是在最开始,并不是直接使用SSO这样的方案来实现的,且听我娓娓道来。
早期的多系统登录常使用同一顶级域名下的cookie共享方法。 例如,公司的多个系统的子域名都在“zhaixing.net”下,比如:“blog.zhaixing.net”与“www.zhaixing.net”,它们的主域名都是zhaixing.net,所以这些网站的cookie都是可以共享的,通过共享cookie来实现网站登录的互联。 这种方法的局限在于:所有系统必须使用相同的域名和技术平台,且cookie存在安全风险。 因此,为了更安全高效地实现多系统登录,逐渐发展到了单点登录(SSO)。
优势:
劣势:
单点登录的原理主要是由下面部分构成:
简单来说,SSO就像是“一次登录,到处通行”的方式,提高了访问效率和安全性。
举个例子,想象你去一个大型购物中心,这里有很多商店。在进入商店前,你需要在购物中心的入口处拿到一个入场手环。一旦你在入口验证了身份并拿到手环,你就可以自由进入中心内的任何一家商店,无需在每家商店门口再次出示身份证明。这个手环就像SSO中的授权令牌,一次验证,多处使用。每个商店都信任这个手环的有效性,因此不需要你每次进店都证明自己的身份。 又或者,你住酒店,酒店会给你发一张一卡通,这个卡可以刷电梯,可以刷早餐,可以插卡取电...等等。
注:素材图片取自www.cnblogs.com/ywlaker/p/6…
以上的流程图用文字描绘如下:
全局会话与局部会话的关系:
示例: 想象一下,有一个用户Tom。Tom首先访问公司的邮件系统(系统1),但需要登录。邮件系统将他重定向到公司的SSO认证中心,Tom在那里登录。登录成功后,他被带回邮件系统,并且可以访问他的邮件。之后,Tom决定查看公司的内部论坛(系统2)。当他点击论坛链接时,系统检测到他已经通过SSO登录,因此直接允许他访问,而无需再次登录。在这个过程中,Tom与SSO认证中心的会话是全局的,而他与邮件系统和论坛的会话是局部的。
“零信任”采取“从不信任,始终验证”的安全方法:任何用户、应用或设备 - 无论是在网络外部,还是已经通过身份验证并位于网络内部 - 都必须在访问所需的下一个网络资源之前验证其身份。 随着网络变得更加分散,跨越的本地基础架构以及私有云和公有云数量更多,零信任方法对于防止渗透网络的威胁获得更多访问权限并造成最大的损害至关重要。 SSO 被广泛视为实施零信任方法的基础技术,尤其是作为 IAM 解决方案一部分的 SSO。 零信任的基本挑战是创建一个安全架构,打击渗透网络的攻击者,而不会阻碍获得授权的最终用户在网络中自由行动并完成工作或业务。 与多因子身份验证、访问和权限控制、网络微分段等技术和最佳实践相结合后,SSO 可以帮助组织实现这种平衡。
人话:字面意思,谁都不信任,不管是谁,都需要认证,也就是结合授权登录并要求每次每个业务的产品都要授权一次,不再是自由访问同一个主域名下所有站点,而Google就属于没有采取这种模式的情况。
“零信任”是一种网络安全方法,其核心理念是“永远不要盲目信任,总是进行验证”。在这种模型下:
单点登录(SSO)在零信任模型中扮演重要角色,因为它是身份和访问管理(IAM)的一部分:
想象一家公司,员工们需要访问电子邮件、文档存储和内部应用程序等多种系统。在零信任模型下:
通过这种方式,零信任模型结合SSO可以既提高安全性,又不过度阻碍员工的工作效率。
单点登录(SSO)的实现方式多种多样,不仅限于使用会话的方式,下面列举出SSO实现的不同方式:
每种SSO实现都有其优点和适用场景。选择哪种方法取决于多种因素,如安全要求、系统架构、易用性和维护成本等。随着云服务和微服务架构的兴起,基于令牌的SSO和使用OAuth/OpenID Connect的方法变得越来越流行。 不够目前我使用的最多的,就是基于Token的SSO实现了,也就是令牌的方式,而且一般实现Token令牌的策略时,一般Token也会有一个自定义的Session作为其他用途,然后就是Oauth2.0可能比较多。
注:素材图片取自www.cnblogs.com/ywlaker/p/6…
以上的流程图用文字描绘如下:
示例: 比如,Alice在她的工作地点使用了邮件系统(系统1)和内部论坛(系统2)。她首先登录邮件系统,然后无需再次登录即可访问论坛。当Alice在邮件系统中点击注销时,邮件系统将这个请求发送给SSO认证中心。SSO认证中心确认后,通知(或者是前端主动拉取状态)论坛系统Alice已注销。接着,论坛系统销毁与Alice相关的会话。在这个过程中,Alice的全局会话和所有相关的局部会话都被销毁,确保她在所有系统中都成功注销,最后,Alice被重定向回登录页面。
注:此图片取自www.cnblogs.com/ywlaker/p/6…
假设Alice在工作时需要访问公司的邮件系统(系统A,一个sso-client)和人力资源管理系统(系统B,另一个sso-client)。 当Alice首次尝试访问系统A时,她被重定向到sso-server(SSO认证中心)进行登录。 登录后,sso-server创建一个全局会话和一个授权令牌,并将这个令牌发送回系统A。系统A接收令牌,验证其有效性,并为Alice在其系统内创建一个局部会话。 接着,当Alice访问系统B时,由于她已经在sso-server登录,系统B可以通过与sso-server的通信来确认她的身份,并为她创建另一个局部会话,无需她重新登录。 如果Alice在任一系统中注销,sso-client会通知sso-server,后者随即销毁全局会话,并通知所有相关的sso-client销毁它们的局部会话。
注:编码部分使用AI生成,不一定准确,仅供参考,如果想要准确的代码,可以查看开源的XXL-SSO项目。
ChatGPT使用了SpringSecurity框架,我不太建议使用它,我建议使用Sa-Token权限框架或者自己手写一个简单的权限模块会更好。 要使用Spring Boot实现一个简单的单点登录(SSO)系统,包括 sso-server 和 sso-client,您需要创建两个独立的Spring Boot项目:一个用于sso-server,另一个用于sso-client。我将向您展示如何搭建基本结构和关键配置。请注意,为了简化,这里的例子仅作为入门级演示,并非生产级代码。
Maven 依赖: 在 pom.xml
文件中,添加以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- 其他依赖... -->
</dependencies>
Spring Security 配置: 创建一个配置类来设置Spring Security。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// author JanYork
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.csrf().disable();
}
}
用户信息服务: 提供一个简单的用户信息服务。
@Service
public class UserService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 这里应该连接到您的用户数据库,下面仅为示例
if ("admin".equals(username)) {
return new User("admin", "password", new ArrayList<>());
} else {
throw new UsernameNotFoundException("用户未找到");
}
}
}
Maven 依赖: 同样在 pom.xml
中添加Spring Boot和Spring Security依赖。
Spring Security 配置: 设置安全配置,以连接到 sso-server。
@Configuration
@EnableWebSecurity
public class ClientSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login()
.and()
.csrf().disable();
}
}
资源控制器: 创建一个简单的控制器来测试认证。
@RestController
public class TestController {
@GetMapping("/")
public String home() {
return "欢迎来到SSO Client!";
}
}
要实现完整的SSO解决方案,您可能需要花费更多时间来深入研究Spring Security、OAuth2协议以及相关的最佳实践。
授权登录诞生的主要原因是为了在保护用户隐私和安全的前提下,实现跨应用程序或服务的数据访问和功能共享。它解决了传统登录方法中用户凭据(如用户名和密码)需要被多个应用程序共享的问题,减少了数据泄露风险,并简化了用户操作流程。 同时很多服务商都设立有开放平台,可以让其他公司或者个人产品使用对应的授权登录,从而实现了部分社会便利性。
OAuth 2.0是一个行业标准的授权协议,允许用户授予第三方应用对自己在某个服务上的特定数据的有限访问权限,而无需将自己的登录凭据(用户名和密码)提供给第三方应用。 它定义了几种授权流程,适用于不同的客户端环境和使用场景。
要去详细的了解Oauth的话还是有些麻烦的,这里就不多说了,如果有需要,小简可以在下一次写一篇Oauth相关的文章。
授权登录的基本原理涉及以下几个关键步骤:
在一个典型的授权登录架构中,涉及三个主要角色:
通过这种方式,OAuth为用户提供了一种安全的方式来允许第三方应用访问其在不同服务上的数据,而无需暴露其登录凭证。这不仅提高了安全性,同时也提供了更好的用户体验,因为用户无需为每个应用或服务创建和记住新的账户信息。
注:编码部分使用AI生成,基本上不准确,仅供参考,如果需要实际使用,可以直接使用开源项目JustAuth,几乎集成了市面上常用的第三方授权登录服务,只需要简单配置就可以实现。
要使用Spring Boot实现一个授权登录业务,通常会结合Spring Security和OAuth 2.0。以下是一个简单的授权登录实现的概要步骤,假设我们正在创建一个允许用户通过Google账户登录的应用。
首先,创建一个新的Spring Boot项目。可以使用Spring Initializr来快速生成项目结构。
在项目的pom.xml
文件中添加必要的依赖。主要包括Spring Boot Starter Web、Spring Boot Starter Security和Spring Security OAuth2 Client。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
<!-- 其他依赖... -->
</dependencies>
在application.properties
或application.yml
文件中,添加OAuth 2.0客户端配置。你需要在Google Cloud Platform上创建一个OAuth 2.0客户端ID和密钥,并将它们添加到配置中。
spring:
security:
oauth2:
client:
registration:
google:
clientId: [Google-Client-ID]
clientSecret: [Google-Client-Secret]
scope:
- email
- profile
创建一个安全配置类,配置Spring Security以使用OAuth 2.0进行登录。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests(authorizeRequests ->
authorizeRequests
.antMatchers("/", "/home", "/error", "/webjars/**").permitAll()
.anyRequest().authenticated()
)
.oauth2Login();
}
}
创建一个简单的控制器来处理登录和用户信息的显示。
@Controller
public class WebController {
@GetMapping("/")
public String home() {
return "home";
}
@GetMapping("/user")
@ResponseBody
public Principal user(Principal principal) {
return principal;
}
}
创建一个简单的前端页面(如home.html
),在其中添加一个登录链接。
<!DOCTYPE html>
<html>
<head>
<title>Home</title>
</head>
<body>
<h2>Welcome</h2>
<a href="/oauth2/authorization/google">Login with Google</a>
</body>
</html>
运行应用程序并访问主页。点击“Login with Google”链接,你将被重定向到Google的登录页面。登录后,Google将重定向回你的应用,并且你可以访问受保护的用户信息。
这个例子提供了一个基本的授权登录流程实现框架。根据具体的业务需求,你可能需要进一步定制安全配置、用户信息处理逻辑等。
注:编码部分使用AI生成,不一定准确,仅供参考。
要实现一个基于Spring Boot的OAuth2授权登录服务,我们将创建两个项目模块:一个作为授权服务器(server),另一个作为客户端(client)。下面分别说明这两个模块的基本设置和实现。
AuthServer
。pom.xml
中添加Spring Security和OAuth2依赖。<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
<version>2.4.0.RELEASE</version>
</dependency>
<!-- 其他依赖... -->
</dependencies>
UserDetailsService
来提供用户认证,并配置Spring Security。AuthClient
。pom.xml
中添加Spring Boot Starter Web和OAuth2客户端依赖。<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<!-- 其他依赖... -->
</dependencies>
application.properties
或application.yml
中配置OAuth2客户端信息,指向授权服务器。通过这种方式,你可以设置一个完整的OAuth2授权登录流程,其中授权服务器负责用户认证和令牌发放,客户端负责向用户展示登录界面并使用授权服务器提供的服务。
感谢大家能够阅读完这一篇长篇幅的文章,虽然看起来简单,但是只有详细深入的了解业务,才可以真正优雅的实现需求。