当前位置:网站首页>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
边栏推荐
- C语言对文件的操作(完整版)
- arm learning-1-development board
- MNIST手写数字识别 —— 基于Mindspore快速构建感知机实现十分类
- Design and implementation of legal aid platform based on asp.net (with project link)
- LeetCode_Nov_2nd_Week
- LeetCode_Nov_3rd_Week
- MNIST手写数字识别 —— ResNet-经典卷积神经网络
- FAREWARE ADDRESS
- JDBC第一学之进行数据库连接时出现The server time zone.....解决办法
- 线程池原理
猜你喜欢

"A minute" Copy siege lion log 】 【 run MindSpore LeNet model

No matching function for call to 'RCTBridgeModuleNameForClass'

LeetCode_Nov_3rd_Week

MNIST Handwritten Digit Recognition - Image Analysis Method for Binary Classification

Cut the hit pro subtitles export of essays

集合---ArrayList的底层

Completely remove MySQL tutorial

Copy Siege Lions "sticky" to AI couplets

Code to celebrate the Dragon Boat Festival - Zongzi, your heart

管道重定向
随机推荐
Pytest common plug-in
Postgresql snapshot
[Development Miscellaneous][Editor][Code Reading]ctags & vim
The usefulness of bind() system call
Golang环境变量设置(二)--GOMODULE&GOPROXY
[Daily office][shell] Common code snippets
[English learning][sentence] good sentence
动态内存管理-C语言
枚举和联合(自定义类型)-C语言
MNIST手写数字识别 —— 图像分析法实现二分类
Machine Learning - Processing of Text Labels for Classification Problems (Feature Engineering)
Windows10重置MySQL用户密码
MNIST Handwritten Digit Recognition - From Perceptrons to Convolutional Neural Networks
makefile基础学习
Rules.make - suitable for viewing in edit mode
在AWS-EC2中安装Minikube集群
线程池原理
strlen 转义字符
MNIST手写数字识别 —— ResNet-经典卷积神经网络
MOOSE平台使用入门攻略——如何运行官方教程的例子