Keycloak快速上手指南(二)

简介: Keycloak快速上手指南

Vue应用集成Keycloak

创建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">
    {{ msg }}
    <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()这2个方法内部分别请求restful api

Spring Boot应用集成Keycloak

添加Keycloak Maven依赖

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

Spring Boot配置文件

官方文档及网上大部分示例使用的都是properties格式的配置文件,而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:上文添加客户端后Credentials Tab内对应的内容
  • bearer-only:设置为true,表示此应用的Keycloak访问类型是bearer-only
  • cors:设置为true表示允许跨域访问
  • security-constraints:主要是针对不同的路径定义角色以达到权限管理的目的
  • /customer:只允许拥有ROLE_CUSTOMER角色的用户才能访问
  • /admin:只允许拥有ROLE_ADMIN角色的用户才能访问
  • 未配置的路径表示公开访问

Controller内容

@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端口对应Spring Boot实现的restful api项目

首次访问vue前端项目

第一次访问vue项目会跳转Keycloak登录页

登录admin用户

登录customer用户

总结

Keycloak部署及接入简单,轻量的同时功能又不失强大,非常适合企业内部的SSO方案。

相关文章
|
7月前
|
缓存 前端开发 API
手把手教你云相册项目简易开发day5 API服务搭建和权限框架
手把手教你云相册项目简易开发day5 API服务搭建和权限框架
91 0
|
1月前
|
小程序
内网环境中ruoyi若依实现微信小程序授权登录解决办法
内网环境中ruoyi若依实现微信小程序授权登录解决办法
222 0
|
Java 应用服务中间件 nginx
GitLab 配置 OAuth2 实现第三方登录,简直太方便了!
GitLab 配置 OAuth2 实现第三方登录,简直太方便了!
GitLab 配置 OAuth2 实现第三方登录,简直太方便了!
|
7月前
|
前端开发 JavaScript API
Keycloak快速上手指南(一)
Keycloak快速上手指南
305 0
|
11月前
|
存储 前端开发 数据安全/隐私保护
十五.SpringCloud+Security+Oauth2实现微服务授权 -前端登录实战
SpringCloud+Security+Oauth2实现微服务授权 -前端登录实战
|
11月前
|
Java Go Nacos
Nacos服务注册和发现以及配置管理技术分享,Go中接入非常简单极易上手
Nacos服务注册和发现以及配置管理技术分享,Go中接入非常简单极易上手
|
网络安全 开发工具 数据安全/隐私保护
Gitlab上手指南(三)|在企业中如何注册Gitlab,如何创建公司项目?
一般企业的gitlab都是私有的,也就是部署在企业私有服务器上面,外网不能访问,比如<https://icode.xiumubai.com/>,在入职的时候,公司会给你开通企业邮箱,使用这个邮箱就可以登陆企业gitlab。
1187 0
|
小程序 Java
小程序开发 |微信公众平台SpringBoot开发实例 │ OAuth2.0网页授权应用开发
在手机微信公众号中输入文本(如你好),在手机微信公众号中显示一个访问权限的链接
226 0
小程序开发 |微信公众平台SpringBoot开发实例 │ OAuth2.0网页授权应用开发
|
SQL JSON 移动开发
基于Uniapp+SpringBoot实现微信小程序授权登录
基于Uniapp+SpringBoot实现微信小程序授权登录
1612 0
基于Uniapp+SpringBoot实现微信小程序授权登录
|
缓存 开发框架 前端开发
SpringCloud微服务实战——搭建企业级开发框架(四十一):扩展JustAuth+SpringSecurity+Vue实现多租户系统微信扫码、钉钉扫码等第三方登录
  如果我们自己的系统需要调用第三方登录,那么我们就需要实现单点登录客户端,然后跟需要对接的平台调试登录SDK。JustAuth是第三方授权登录的工具类库,对接了国外内数十家第三方登录的SDK,我们在需要实现第三方登录时,只需要集成JustAuth工具包,然后配置即可实现第三方登录,省去了需要对接不同SDK的麻烦。   JustAuth官方提供了多种入门指南,集成使用非常方便。但是如果要贴合我们自有开发框架的业务需求,还是需要进行整合优化。下面根据我们的系统需求,从两方面进行整合:一是支持多租户功能,二是和自有系统的用户进行匹配。
3311 0
SpringCloud微服务实战——搭建企业级开发框架(四十一):扩展JustAuth+SpringSecurity+Vue实现多租户系统微信扫码、钉钉扫码等第三方登录