Keycloak Краткое руководство

Java

Вход в систему и аутентификация удостоверений являются одной из самых основных функций современных веб-приложений.Для систем внутри предприятия несколько систем часто надеются иметь набор служб SSO для управления логином и аутентификацией удостоверений корпоративных пользователей унифицированным образом, чтобы Чтобы улучшить использование пользователями нескольких систем одновременно, Keycloak был создан для этого сценария. В этой статье будет кратко рассказано об установке и использовании Keycloak, а также приведен пример того, как быстро получить доступ к Keycloak для популярных в настоящее время приложений для разделения интерфейсов и серверов.

Что такое брелок

Keycloak — это решение IAM (управление идентификацией и доступом) с открытым исходным кодом для современных приложений и сервисов.

Keycloak обеспечивает функциональность единого входа (SSO), которая поддерживаетOpenID Connect,OAuth 2.0,SAML 2.0Стандартный протокол, имеет простую в использовании консоль управления и обеспечивает поддержку LDAP, Active Directory и учетных записей социальных сетей, таких как Github и Google, что делает его очень простым в использовании из коробки.

Введение в общие основные понятия Keycloak

Во-первых, давайте разберемся с общей основной концепцией через официальную картинку.

keycloak-core-concepts

Вот только 4 наиболее часто используемых основных понятия:

  1. Users: пользователи, объекты, которые используют и должны войти в систему

  2. Roles: роль, используемая для управления разрешениями пользователей.

  3. Clients: клиент, приложения и службы, которым необходим доступ к Keycloak и которые должны быть защищены с помощью Keycloak.

  4. Realms: Домен, домен управляет группой пользователей, сертификатами, ролями, группами и т. д. Пользователь может принадлежать только одному домену и может входить в него, домены изолированы друг от друга, а домен может управлять только пользователями под Это

Установка и настройка сервиса Keycloak

Установить Keycloak

Есть много способов установить Keycloak, здесь используйте Docker для быстрой установки.

docker run -d --name keycloak \
    -p 8080:8080 \
    -e KEYCLOAK_USER=admin \
    -e KEYCLOAK_PASSWORD=admin \
    jboss/keycloak:10.0.0

доступhttp://localhost:8080и нажмите Консоль администрирования, чтобы войти

keycloak-web-home

Создать мир

Создать новый реалм: демо, все последующие клиенты, пользователи, роли и т.д. создаются в этом реалме

keycloak-web-add-realm-1

keycloak-web-add-realm-2

keycloak-web-add-realm-3

Создать клиента

Создать интерфейсный клиент приложения

Создайте новый клиент: vue-demo, выберите public для типа доступа.

keycloak-web-add-client-1

Создание клиентского приложения для серверной части

Создайте новый клиент: spring-boot-demo, выберите Bearer-only для типа доступа.

keycloak-web-add-client-2

После сохранения появится вкладка Credentials, запишите сюда секрет, который будет использоваться позже

keycloak-web-add-client-3

О типе доступа клиента (Access Type)

Типы доступа двух клиентов, созданных выше, являются общедоступными и предназначены только для носителя, так почему же стоит выбрать этот тип и в чем разница между фактическими типами доступа?

На самом деле Keycloak в настоящее время имеет 3 типа доступа:

confidential: применимо к серверным приложениям и требует входа в браузер и получения ключа.access tokenместо действия. Типичным сценарием использования является серверная веб-система.

public: применимо к клиентским приложениям, требующим входа через браузер. Типичными сценариями использования являются интерфейсные веб-системы, в том числе интерфейсные проекты, реализованные с помощью vue и react.

bearer-only: применимо к серверным приложениям, вход в браузер не требуется, разрешено только использоватьbearer tokenзапрошенная сцена. Типичный сценарий использования — restful API.

Создание пользователей и ролей

Создание роли

Создайте 2 роли: ROLE_ADMIN, ROLE_CUSTOMER.

keycloak-web-add-role

Создать пользователя

Создайте 2 пользователей: администратор, клиент

keycloak-web-add-user

Привязать пользователей и роли

Назначить роль ROLE_ADMIN пользователю-администратору

keycloak-web-add-user-role-1

Назначьте роль ROLE_CUSTOMER пользователю клиента.

keycloak-web-add-user-role-2

Краткое руководство по интеграции Keycloak с приложениями Vue

Создать vue-проект

vue create vue-demo

Добавить официальный адаптер Keycloak js

npm i keycloak-js --save
npm i axios --save

main.js

import Vue from 'vue'
import App from './App.vue'
import Keycloak from 'keycloak-js'

Vue.config.productionTip = false

// keycloak init options
const initOptions = {
  url: 'http://127.0.0.1:8080/auth',
  realm: 'demo',
  clientId: 'vue-demo',
  onLoad:'login-required'
}

const keycloak = Keycloak(initOptions)

keycloak.init({ onLoad: initOptions.onLoad, promiseType: 'native' }).then((authenticated) =>{
  if(!authenticated) {
    window.location.reload();
  } else {
    Vue.prototype.$keycloak = keycloak
    console.log('Authenticated')
  }

  new Vue({
    render: h => h(App),
  }).$mount('#app')

  setInterval(() =>{
    keycloak.updateToken(70).then((refreshed)=>{
      if (refreshed) {
        console.log('Token refreshed');
      } else {
        console.log('Token not refreshed, valid for '
            + Math.round(keycloak.tokenParsed.exp + keycloak.timeSkew - new Date().getTime() / 1000) + ' seconds');
      }
    }).catch(error => {
      console.log('Failed to refresh token', error)
    })
  }, 60000)

}).catch(error => {
  console.log('Authenticated Failed', error)
})

HelloWorld.vue

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <div>
      <p>
        current user: {{user}}
      </p>
      <p>
        roles: {{roles}}
      </p>
      <p>
        {{adminMsg}}
      </p>
      <p>
        {{customerMsg}}
      </p>
    </div>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },
  data() {
    return {
      user: '',
      roles: [],
      adminMsg: '',
      customerMsg: ''
    }
  },
  created() {
    this.user = this.$keycloak.idTokenParsed.preferred_username
    this.roles = this.$keycloak.realmAccess.roles

    this.getAdmin()
            .then(response=>{
              this.adminMsg = response.data
            })
            .catch(error => {
              console.log(error)
            })

    this.getCustomer()
            .then(response => {
              this.customerMsg = response.data
            })
            .catch(error => {
              console.log(error)
            })
  },
  methods: {
    getAdmin() {
      return axios({
        method: 'get',
        url: 'http://127.0.0.1:8082/admin',
        headers: {'Authorization': 'Bearer ' + this.$keycloak.token}
      })
    },
    getCustomer() {
      return axios({
        method: 'get',
        url: 'http://127.0.0.1:8082/customer',
        headers: {'Authorization': 'Bearer ' + this.$keycloak.token}
      })
    }
  }
}
</script>

getAdmin()иgetCustomer()Эти два метода запрашивают restful API соответственно.

Краткое руководство по интеграции Keycloak с приложениями Spring Boot

Добавить зависимость Keycloak Maven

<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-spring-boot-starter</artifactId>
    <version>10.0.0</version>
</dependency>

Файл конфигурации Spring Boot

В большинстве официальных документов и онлайн-примеров используются файлы конфигурации в формате свойств, в то время как файлы конфигурации в формате yaml относительно проще и понятнее.В этом примере используются файлы конфигурации в формате yaml, а содержание выглядит следующим образом.

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
  bearer-only: true
  use-resource-role-mappings: false
  cors: true
  security-constraints:
    - authRoles:
        - ROLE_CUSTOMER
      securityCollections:
        - name: customer
          patterns:
            - /customer
    - authRoles:
        - ROLE_ADMIN
      securityCollections:
        - name: admin
          patterns:
            - /admin

В дополнение к нескольким обязательным элементам конфигурации, необходимо отметить несколько элементов конфигурации, а именно:

credentials.secret: соответствующее содержимое на вкладке «Учетные данные» после добавления клиента выше.

bearer-only: установите значение true, указывающее, что тип доступа Keycloak для этого приложения — только переносной.

cors: установите значение true, чтобы разрешить междоменный доступ.

security-constraints: В основном определяют роли для различных путей достижения цели управления правами.

  • /customer: разрешено иметь толькоROLE_CUSTOMERпользователи роли могут получить доступ
  • /admin: разрешено иметь толькоROLE_ADMINпользователи роли могут получить доступ
  • Ненастроенный способ означает публичный доступ

Содержимое контроллера

@RestController
public class HomeController {
    @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";
    }
}

Демонстрация эффекта проекта

После запуска внешнего и внутреннего проектов соответственно локальный порт 8081 соответствует внешнему проекту Vue, а локальный порт 8082 соответствует проекту restful API, реализованному Spring Boot.

Первый визит в интерфейсный проект vue

При первом посещении проекта vue вы перейдете на страницу входа в Keycloak.

keycloak-demo-1

логин администратора

keycloak-demo-2

Войти пользователь клиента

keycloak-demo-3

Суммировать

Keycloak прост в развертывании и доступе, легкий и мощный, что делает его очень подходящим для решений SSO на предприятиях.

Пример адреса проекта из этой статьи:keycloak-demo