当前位置:网站首页>SSO单点登陆
SSO单点登陆
2022-08-04 05:31:00 【wwcoding】
1 SSO简介
1.1 什么是SSO
单点登录(SingleSignOn,SSO),在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。单点登录常用的协议包括 CAS、OAuth、OpenID Connect、SAML。
例如:百度旗下有很多的产品,比如百度贴吧、百度知道、百度文库等,只要登录百度账号,在任何一个地方都是已登录状态,不需要重新登录。
第三方登陆:某系统,使用其它系统的用户实现本系统的登陆的方式。如:在京东中使用微信登陆。
1.2 SSO系统
1.2.1 早期多系统登录解决方案
单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器与服务器之间维护会话状态。但cookie是有限制的,这个限制就是cookie的域(通常对应网站的域名),浏览器发送http请求时会自动携带与该域匹配的cookie,而不是所有cookie
既然这样,为什么不将web应用群中所有子系统的域名统一在一个顶级域名下,例如“*.baidu.com”,然后将它们的cookie域设置为“baidu.com”,这种做法理论上是可以的,甚至早期很多多系统登录就采用这种同域名共享cookie的方式。
共享cookie的方式存在众多局限。
应用群域名得统一
应用群各系统使用的技术(至少是web服务器)要相同,不然cookie的key值(tomcat为JSESSIONID)不同,无法维持会话,共享cookie的方式是无法实现跨语言技术平台登录的,比如java、php、.net系统之间
cookie本身不安全。
1.2.2 基于CAS的SSO系统
CAS即Central Authentication Service模型(中央式认证服务),该协议是为应用提供可信身份认证的单点登录系统。CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。
场景说明
子系统A域名:http://www.a.com
子系统B域名:http://www.b.com
CAS系统域名:http://www.cas.com
登录操作是在 CAS Server(登录中心)实现的,客户端 Web 应用 A、B 都是通过 Ticket 进行登录状态验证,验证通过后各自设置 Session 完成各自系统的认证,从而实现单点登录。
https://apereo.github.io/cas/6.5.x/protocol/CAS-Protocol.html#web-flow-diagram
2 通过Keycloak实现SSO
2.1 Keycloak 简介
2.1.1 什么是Keycloak?
Keycloak是为现代应用系统和服务提供开源的认证和授权访问控制管理。Keycloak 实现了OpenID、OAuth2.0、SAML单点登录协议,同时提供 LDAP 和 Active Directory 以及 OpenID Connect、SAML2.0 IdPs、Github、Google 等第三方登录适配功能,能够做到非常简单的开箱即用。
2.1.2 Keycloak中的常用核心概念
Users: 用户,使用并需要登录系统的对象
Roles: 角色,用来对用户的权限进行管理
Clients: 客户端,需要接入Keycloak并被Keycloak保护的应用和服务
Realms: 领域,领域管理着一批用户、证书、角色、组等,一个用户只能属于并且能登陆到一个域,域之间是互相独立隔离的, 一个域只能管理它下面所属的用户
2.2 OpenID Connect
2.2.1 什么是OpenID Connect?
OpenID Connect简称为OIDC,已成为Internet上单点登录和身份管理的通用标准。 它在OAuth2上构建了一个身份层,是一个基于OAuth2协议的身份认证标准协议。
OAuth2.0 只是一个授权协议,它授权第三方应用获取访问某些资源的权限,但是并不会提供任何用户信息。它通常是返回的是调用某些web api所需的access token。
2.2.2 OAuth授权流程
四种授权许可
Authorization Code:授权码,最经典的模式,用code来换token,这个最安全。
Implicit:隐式许可;不用code,直接获取token,适用于没有后端服务器的应用。
Resource Owner Password Credentials:通过资源所有者密码凭据,获取token
Client Credentials :客户端凭据。
[认证 & 授权] 1. OAuth2授权 - blackheart - 博客园 (cnblogs.com)
2.2.3 OpenID Connect授权流程
OpenID Connect对OAuth2.0接口进行了扩展,通过在协议中扩展身份认证所需的ID Token字段,增加UserInfo Endpoint接口,向第三方应用提供身份认证服务。
用户执行OAuth2.0的授权流程后,第三方应用获得Access Token和附加的ID Token,ID Token包含基本的用户身份信息,可用于身份认证。
如果需要更详细用户信息,第三方应用通过Access Token,从认证服务UserInfo Endpoint接口获取用户信息。
第三方应用可以把ID Token和UserInfo信息作为认证用户的用户信息。
2.3 Keycloak实现SSO
2.3.1 系统接入SSO
2.3.2 实现过程
- 安装启动Keycloak
docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:18.0.1 start-dev
配置Keycloak
Keycloak Admin Console
创建配置Realm和Client
创建Role和UserSpringBoot集成Keycloak
添加依赖
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-starter</artifactId>
<version>10.0.0</version>
</dependency>
- 配置文件
spring:
application:
name: keycloakDemo
server:
port: 8600
keycloak:
# 表示是一个public的client
public-client: true
# keycloak的地址
auth-server-url: http://localhost:8080/auth
# keycloak中的realm
realm: myrealm
# client ID
resource: keycloakDemo
# 安全约束
securityConstraints:
- authRoles:
# 以下路径需要demoUser角色才能访问
- demoUser
securityCollections:
# name可以随便写
- name: common user
patterns:
- /demo/getValue
- 代码测试
@RestController
@RequestMapping("/demo")
class DemoController {
@GetMapping("login")
public String login(HttpServletRequest request) {
Principal userPrincipal = request.getUserPrincipal();
String username="Hello, ";
if (userPrincipal instanceof KeycloakPrincipal) {
KeycloakPrincipal<KeycloakSecurityContext> kp = (KeycloakPrincipal<KeycloakSecurityContext>) userPrincipal;
AccessToken accessToken=kp.getKeycloakSecurityContext().getToken();
username += accessToken.getPreferredUsername();
}
return username;
}
2.2.3 功能案例
参考资料
OAuth 2.0 — OAuth
Getting Started Guide (keycloak.org)
doc/keycloak-learn/Keycloak搭建手把手操作指南.md · 大目/spring-cloud-yes - Gitee.com
边栏推荐
猜你喜欢
Amazon Cloud Technology Build On 2022 - AIot Season 2 IoT Special Experiment Experience
深度学习理论——过拟合、欠拟合、正则化、优化器
第三章 标准单元库(上)
LeetCode_Nov_3rd_Week
迅雷关闭自动更新
Tencent and NetEase have taken action one after another. What is the metaverse that is so popular that it is out of the circle?
第二章 STA相关概念
tmux concept and usage
MOOSE平台使用入门攻略——如何运行官方教程的例子
MNIST Handwritten Digit Recognition - Building a Perceptron from Zero for Two-Classification
随机推荐
LeetCode_Nov_2nd_Week
MySQL存储过程学习笔记(基于8.0)
LeetCode_22_Apr_2nd_Week
MNIST手写数字识别 —— 从零构建感知机实现二分类
[Copy Siege Lion Log] Flying Pulp Academy Intensive Learning 7-Day Punch Camp-Study Notes
MNIST手写数字识别 —— 从感知机到卷积神经网络
Code to celebrate the Dragon Boat Festival - Zongzi, your heart
C语言数组的深度分析
Deep learning, "grain and grass" first--On the way to obtain data sets
AWS uses EC2 to reduce the training cost of DeepRacer: DeepRacer-for-cloud practical operation
Socket编程详解
[Development Miscellaneous][Editor][Code Reading]ctags & vim
LeetCode_Dec_2nd_Week
库函数的模拟实现-C语言
[日常办公][杂项][vscode]tab space
LeetCode_Nov_5th_Week
FAREWARE ADDRESS
(位操作符)按位与、按位或、按位异或
Fabric v1.1 环境搭建
MOOSE平台官方第二个例子分析——关于创建Kernel,求解对流扩散方程