Keycloak详解

简述

  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

 

posted @ 2023-03-17 18:22  艾尔夏尔-Layton  阅读(3305)  评论(0编辑  收藏  举报