简述
keycloak是一个针对现代应用程序和服务的开源身份和访问管理解决方案,本质就是个中间件,keycloak支持单点登录SSO,服务可通过OpenID Connect、OAuth 2.0 等协议对接 Keycloak
SSO单点登录
SSO指的是Single Sign On,中文是单点登录。指的是在多个系统上,用户只需登录一次,多个系统都会感知到用户已经登录了
例如我们打开了天猫和淘宝两个系统页面,我登录了淘宝,转到天猫系统会发现天猫也是登录好的状态
安装
这里使用docker的方式安装keycloak,这里指定了管理员账号和密码都是admin
docker run -d --name keycloak \ -p 8080:8080 \ -e KEYCLOAK_USER=admin \ -e KEYCLOAK_PASSWORD=admin \ jboss/keycloak:10.0.0
启动后可以访问http://localhost:8080/auth/,能访问到就代表安装成功
网页控制台用法
创建领域
点击Administration Console进行登录
现在点击Add realm创建一个领域
输入领域名即可创建一个新的领域
然后切换到自己创建的领域
创建客户端
点击clients,然后点create
输入客户端名字即可进行客户端的创建,然后可进行客户端的配置,这里我创建了Vue-demo客户端
在下方Access Type中可选择客户端的访问类型
我们用同样的方式创建后端服务clients,起名叫spring-boot-demo,Access Type中选择bearer-only
保存好后在Credentials一栏中可以查看Secret,这里的Secret用于配制后端服务
创建角色
创建两个角色ROLE_ADMIN和ROLE_CUSTOMER
创建用户
创建2个用户:admin、customer
为用户分配角色
在user的edit界面的Role Mappings可以为用户分配角色
我们为admin用户分配ROLE_ADMIN角色,为customer用户分配ROLE_CUSTOMER角色
客户端访问类型
public
适用于客户端应用,且需要浏览器登录的场景。典型的使用场景就是前端web系统,包括采用vue、react实现的前端项目等。
bearer-only
适用于服务端应用,不需要浏览器登录,只允许使用bearer token
请求的场景。典型的使用场景就是restful api。
confidential
适用于服务端应用,且需要浏览器登录以及需要通过密钥获取access token
的场景。典型的使用场景就是服务端渲染的web系统。
keycloak核心概念
User:用户,指使用并需要登录系统的对象
Roles:用户角色,指的是用户的类型,例如管理员和超级管理员
Clients:客户端,指接入keycloak并发起登录请求的服务
Realms:领域,领域是一批用户、证书、角色的集合,一个用户只能属于并且能登陆到一个域,域之间是互相独立隔离的, 一个域只能管理它下面所属的用户
后端服务接入Keycloak
我们创建一个springboot后端项目
引入依赖
我们导入keycloak的依赖
implementation 'org.keycloak:keycloak-core:20.0.5' implementation 'org.keycloak:keycloak-spring-boot-starter:20.0.5'
spingboot配置
配置springboot配置文件
server: port: 8082 keycloak: realm: demo #领域名 auth-server-url: http://127.0.0.1:8080/auth resource: spring-boot-demo ssl-required: external credentials: secret: 2d2ab498-7af9-48c0-89a3-5eec929e462b #client配置时的密钥 bearer-only: true #表示此时access type是bearer-only use-resource-role-mappings: false cors: true #true代表允许跨域访问 security-constraints: #对于不同角色进行配置不同的路径达到权限管理的目的 - authRoles: #代表一种角色 - ROLE_CUSTOMER securityCollections: #该角色下的用户,能为该用户配置路径 - name: customer patterns: - /customer - authRoles: - ROLE_ADMIN securityCollections: - name: admin patterns: - /admin
未配置的路径则为可以公开访问
Controller内容
controller则为普通的路径映射,权限控制由keycloak帮我们做了
@RestController public class UserController { @RequestMapping("/") public String index() { return "index"; } @RequestMapping("/customer") public String customer() { return "only customer can see"; } @RequestMapping("/admin") public String admin() { return "only admin cas see"; } }
我们可以发现用postman无法正常访问我们在controller写的两个api了,因为我们的后端服务接入了Keycloak,并且路径是在配置文件里配置好的,需要在请求的同时携带token信息才允许访问
用postman模拟登录拿token
我们可以用postman模拟前端的登录请求拿到token,使用post请求请求下方url
http://127.0.0.1:8080/auth/realms/你配置的realm名/protocol/openid-connect/token
然后在请求体的参数上,携带四个参数
发起请求就能拿到token
然后将token放在postman自带的token配置项,就可以正常访问后端接口
References
https://www.zhihu.com/question/419613516
https://www.zhihu.com/search?type=content&q=SSO%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95
https://juejin.cn/post/6844903973741150215
标签:登录,admin,用户,token,详解,客户端,Keycloak,keycloak From: https://www.cnblogs.com/CNLayton/p/17227361.html