Вход в систему и аутентификация удостоверений являются одной из самых основных функций современных веб-приложений.Для систем внутри предприятия несколько систем часто надеются иметь набор служб SSO для управления логином и аутентификацией удостоверений корпоративных пользователей унифицированным образом, чтобы Чтобы улучшить использование пользователями нескольких систем одновременно, Keycloak был создан для этого сценария. В этой статье будет кратко рассказано об установке и использовании Keycloak, а также приведен пример того, как быстро получить доступ к Keycloak для популярных в настоящее время приложений для разделения интерфейсов и серверов.
Что такое брелок
Keycloak — это решение IAM (управление идентификацией и доступом) с открытым исходным кодом для современных приложений и сервисов.
Keycloak обеспечивает функциональность единого входа (SSO), которая поддерживаетOpenID Connect
,OAuth 2.0
,SAML 2.0
Стандартный протокол, имеет простую в использовании консоль управления и обеспечивает поддержку LDAP, Active Directory и учетных записей социальных сетей, таких как Github и Google, что делает его очень простым в использовании из коробки.
Введение в общие основные понятия Keycloak
Во-первых, давайте разберемся с общей основной концепцией через официальную картинку.
Вот только 4 наиболее часто используемых основных понятия:
-
Users
: пользователи, объекты, которые используют и должны войти в систему -
Roles
: роль, используемая для управления разрешениями пользователей. -
Clients
: клиент, приложения и службы, которым необходим доступ к Keycloak и которые должны быть защищены с помощью Keycloak. -
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и нажмите Консоль администрирования, чтобы войти
Создать мир
Создать новый реалм: демо, все последующие клиенты, пользователи, роли и т.д. создаются в этом реалме
Создать клиента
Создать интерфейсный клиент приложения
Создайте новый клиент: vue-demo, выберите public для типа доступа.
Создание клиентского приложения для серверной части
Создайте новый клиент: spring-boot-demo, выберите Bearer-only для типа доступа.
После сохранения появится вкладка Credentials, запишите сюда секрет, который будет использоваться позже
О типе доступа клиента (Access Type)
Типы доступа двух клиентов, созданных выше, являются общедоступными и предназначены только для носителя, так почему же стоит выбрать этот тип и в чем разница между фактическими типами доступа?
На самом деле Keycloak в настоящее время имеет 3 типа доступа:
confidential
: применимо к серверным приложениям и требует входа в браузер и получения ключа.access token
место действия. Типичным сценарием использования является серверная веб-система.
public
: применимо к клиентским приложениям, требующим входа через браузер. Типичными сценариями использования являются интерфейсные веб-системы, в том числе интерфейсные проекты, реализованные с помощью vue и react.
bearer-only
: применимо к серверным приложениям, вход в браузер не требуется, разрешено только использоватьbearer token
запрошенная сцена. Типичный сценарий использования — restful API.
Создание пользователей и ролей
Создание роли
Создайте 2 роли: ROLE_ADMIN, ROLE_CUSTOMER.
Создать пользователя
Создайте 2 пользователей: администратор, клиент
Привязать пользователей и роли
Назначить роль ROLE_ADMIN пользователю-администратору
Назначьте роль ROLE_CUSTOMER пользователю клиента.
Краткое руководство по интеграции 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 прост в развертывании и доступе, легкий и мощный, что делает его очень подходящим для решений SSO на предприятиях.
Пример адреса проекта из этой статьи:keycloak-demo