1 概述
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。
当我们访问其中一个前台系统需要登录才可以访问的页面时,自动跳转到登录中心进行登录,登录后再次跳转回该前台系统,该前台系统可以获取登录名。
2 现状
每个应用站点都实现了本站专用的帐号数据库和登录模块。各站点的登录状态相互不认可,各站点需要逐一手工登录。
1、认证(authentication): 验证用户的身份;
2、授权(authorization): 验证用户的访问权限。
3 目标
目标1:设计并实现一个第三方授权中心服务(Server),用于完成用户登录,认证和权限处理。
目标2:可以在授权中心下挂载任意多个资源系统应用(如标注、爬虫等)。
目标3:当用户访问资源系统应用的安全页面时,会重定向到授权中心进行身份验证,认证完成后方可访问资源系统应用的服务,且多资源系统应用只需要登录一次即可。
4 实现方式:Spring Security OAuth2
4.1 描述
OAuth2是一个开放标准,用于授权第三方应用程序访问用户资源,而无需共享用户的用户名和密码。 OAuth2通过颁发令牌来实现授权,提高了系统的安全性和用户隐私保护。Spring Security OAuth2扩展了Spring Security框架,在微服务架构中,Spring Security OAuth2可以帮助企业有效地控制多个服务的统一登录、授权及资源保护工作。它解决了传统登录方式中存在的问题,如用户需要在不同设备上分别登录、第三方应用需要用户提供账号密码、权限管理复杂等。通过使用Spring Security OAuth2,企业可以简化授权流程,提高安全性,并实现细粒度的权限控制。
4.2 角色类型
1、资源拥有者(Resource Owner):资源的合法拥有者。
2、客户端(Client):请求访问资源的第三方应用程序。
3、资源服务器(Resource Server):存储用户资源并响应带有有效令牌的请求。
4、授权服务器(Authorization Server):负责发放和管理访问令牌。
4.3 授权类型
1、授权码模式(Authorization Code):这是最常见的授权模式。用户首先在授权服务器上认证,然后同意授权给客户端。授权服务器生成授权码,客户端使用这个授权码向授权服务器请求访问令牌。这种方式下,用户的原始凭据不会传递给客户端应用。
2、简化模式(Implicit):这种模式下,客户端直接从授权服务器获取令牌,而不是先获取授权码。这种方式适用于那些不支持复杂流程的客户端,如某些JavaScript应用。
3、密码模式(Resource Owner Password Credentials):在这种模式下,客户端直接使用用户的用户名和密码来获取访问令牌。这种方式适用于信任客户端且用户直接提供凭据的场景。
4、客户端凭证模式(Client Credentials):这种模式适用于那些不需要用户参与的场景,例如客户端以自己的名义请求访问令牌。
4.4 使用场景
不同应用系统可以根据具体需求选择合适的授权类型。例如,对于需要用户参与的Web应用,授权码模式可能更合适;而对于某些不需要用户直接参与的后台服务,客户端凭证模式可能更简单高效。
4.5 授权流程
1、用户打开客户端并请求授权。
2、用户同意授权请求。
3、客户端使用授权请求向认证服务器申请令牌。
4、认证服务器验证后发放令牌。
5、客户端使用令牌访问资源服务器。
6、资源服务器验证令牌后提供资源。
4.6 设计思路
4.6.1 认证中心平台
客户端页面
1、登录页面
2、普通用户首页
3、管理员首页
4、账号创建子页面
认证中心后台
1、关键依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
2、@EnableResourceServer:表示作为资源服务器。
认证服务器配置 AuthorizationServerConfig:用于定义资源系统以及token的实现方式。
安全配置 SpringSecurityConfig:配置请求URL的访问策略、定义了同一认证登录页面URL等。
资源系统
1、关键依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
</dependency>
2、关键注解
@EnableOAuth2Sso:标识为SSO的资源系统客户端。
3、身份信息配置
security:
oauth2:
client:
client-id: sheep1
client-secret: 123456
user-authorization-uri: ${auth-server}/oauth/authorize
access-token-uri: ${auth-server}/oauth/token
resource:
jwt:
key-uri: ${auth-server}/oauth/token_key
用于和授权中心进行通信的身份标识。