zoukankan      html  css  js  c++  java
  • springboot整合keycloak

    1. Keycloak是什么?

    Keycloak是一种面向现代应用程序和服务的开源的IAM(身份识别与访问管理)解决方案。

    Keycloak提供了单点登录(SSO)、Identity Brokering和社交账号登录、User Federation、客户端适配器、管理控制台和帐户管理控制台等特性。想了解更多关于Keycloak的信息,请访问官方页面

    在本教程中,我们将使用Keycloak的管理控制台进行配置,然后在Spring Boot应用程序中使用Keycloak Client Adapter和Keycloak服务器连接起来。

    2. 安装配置一个Keycloak服务器

    1. 安装部分参考 keycloak9.0.2单机模式整合mysql8

    2. 创建一个 Realm

    让我们将鼠标导航到左上角,找到“Add Realm”按钮:

    我们把它命名为“SpringBoot“:

    3 .创建一个客户端

    我们需要在应用程序中添加一个客户端,所以我们点击“Create”。我们配置新的Client ID为“product-app“:

    在下一个页面中,对于本教程而言,除了“Valid Redirect URIs 字段”之外,我们将保留所有缺省值。配置完成后,将被重定向到端口8081

    点击保存

    4. 创建一个角色和用户

    Keycloak使用Role-Based Access。因此,每个用户都必须有一个角色。
    我们需要导航到“Role”页面:

    然后,我们添加 “user”角色:

    现在我们已经有了一个可以分配给用户的角色,但是还没有一个用户。因此,让我们去“Users”页面新增一个:

    我们创建用户“user1”:

    一旦用户被创建,用户信息将展示在这里:

    进入“Credentials”选项卡,并将把密码设置为“123456”,注意关闭Temporary ,点击重置密码:

    导航到“Role Mappings”选项卡,并分配用户角色:

    3. 创建一个Spring Boot应用程序

    为了能够保护Spring Boot应用程序,您必须将Keycloak Spring Boot适配器JAR添加到您的应用程序。然后,您必须通过正常的Spring Boot配置(application.properties)提供一些额外的配置。让我们看一下这些步骤。

    1. 官方文档参考

    Keycloak Spring Boot适配器利用了Spring Boot的自动配置功能,因此您所要做的就是将Keycloak Spring Boot启动器添加到您的项目中。

    要使用Maven添加它,请将以下内容添加到您的依赖项中:

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

    添加适配器BOM依赖项:

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>org.keycloak.bom</groupId>
          <artifactId>keycloak-adapter-bom</artifactId>
          <version>9.0.2</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    上面是官方的参考资料

    创建一个springboot简单项目包含如下jar包

    • Web
    • Freemarker
    • Keycloak

    2. 创建springboot项目

    最终的pom.xml文件如下

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.6.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>keycloak-study</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>keycloak-study</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.keycloak.bom</groupId>
                    <artifactId>keycloak-adapter-bom</artifactId>
                    <version>9.0.2</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-freemarker</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.keycloak</groupId>
                <artifactId>keycloak-spring-boot-starter</artifactId>
                <version>9.0.2</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    

    我们的应用程序会比较简单,只包含两个页面:

    • 一个 index.html,它将是登录页面,里面只包含产品页面的链接。
    • product.ftl,它将是我们的产品页面的模板,只能被通过了身份验证的用户访问到。

    首先我们在“/src/resources/static”目录中创建一个简单的index.html文件:

    <html>
    
     <head>
       <title>My awesome landing page</title>
     </head>
    
     <body>
       <h1>Landing page</h1> <a href="/products">My products</a>
     </body>
    
    </html>
    

    现在,我们需要一个控制器:

    package com.example.keycloakstudy.controller;
    
    import com.example.keycloakstudy.service.ProductService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    
    @Controller
    class ProductController {
    
        @Autowired
        ProductService productService;
    
        @GetMapping(path = "/products")
        public String getProducts(Model model){
            model.addAttribute("products", productService.getProducts());
            return "product";
        }
    
        @GetMapping(path = "/logout")
        public String logout(HttpServletRequest request) throws ServletException {
            request.logout();
            return "/";
        }
    }
    

    你会发现这很简单,就是定义了产品页面的映射,然后再为注销操作定义一个映射。你还会注意到,我们调用了一个“ProductService”,它会返回一个字符串列表,我们把这个列表放到 Spring MVC Model 对象里面去,所以我们要创建这个服务:

    package com.example.keycloakstudy.service;
    
    import org.springframework.stereotype.Service;
    
    import java.util.Arrays;
    import java.util.List;
    
    @Service
    public class ProductService {
        public List<String> getProducts() {
            return Arrays.asList("iPad","iPod","iPhone");
        }
    }
    

    我们还需要创建 product.ftl 模板。要在“src/resources/templates”中创建此文件:

    <#import "/spring.ftl" as spring>
    <html>
    <h1>My products</h1>
    <ul>
        <#list products as product>
            <li>${product}</li>
        </#list>
    </ul>
    <p> <a href="/logout">Logout</a> </p>
    
    </html>
    

    在这里,我们简单地遍历了 Spring MVC Model 对象中的产品列表,并添加一个从我们的应用程序中注销的链接。

    3. springboot中配置keycloak

    我们要做的就是向 application.properties 中添加一些keycloak相关的属性。

    一些属性是必须要有的:

    # keycloak安装服务器的IP和端口
    keycloak.auth-server-url=http://localhost:8080/auth
    # realm名称
    keycloak.realm=SpringBoot
    keycloak.public-client=true
    # clientID名称
    keycloak.resource=product-app
    

    我们需要定义一些安全方面的约束,就像你在 web.xml 中使用 Java EE 应用的时候要进行的配置一样:

    # 安全约束
    keycloak.securityConstraints[0].authRoles[0]=user
    keycloak.securityConstraints[0].securityCollections[0].name= common user
    keycloak.securityConstraints[0].securityCollections[0].patterns[0]=/products/*
    

    在这里,我们简单地定义每个向 /products/* 发起的请求都应该通过用户验证,而且该用户得有“user”这个角色。

    现在,我们只需要配置最后一个属性来确保我们的应用程序将会在端口8081上运行:

    server.port=8081
    

    最终完整版的application.properties如下

    server.port=8081
    
    # 是否允许HttpServletRequest属性覆盖(隐藏)控制器生成的同名模型属性。
    spring.freemarker.allow-request-override=false
    # 是否允许HttpSession属性覆盖(隐藏)控制器生成的同名模型属性。
    spring.freemarker.allow-session-override=false
    # 是否启用模板缓存。
    spring.freemarker.cache=false
    # 模板编码。
    spring.freemarker.charset=UTF-8
    # 是否检查模板位置是否存在。
    spring.freemarker.check-template-location=true
    # Content-Type value.
    spring.freemarker.content-type=text/html
    # 是否启用freemarker
    spring.freemarker.enabled=true
    # 设定所有request的属性在merge到模板的时候,是否要都添加到model中.
    spring.freemarker.expose-request-attributes=false
    # 是否在merge模板的时候,将HttpSession属性都添加到model中
    spring.freemarker.expose-session-attributes=false
    # 设定是否以springMacroRequestContext的形式暴露RequestContext给Spring’s macro library使用
    spring.freemarker.expose-spring-macro-helpers=true
    # 是否优先从文件系统加载template,以支持热加载,默认为true
    spring.freemarker.prefer-file-system-access=true
    # 设定模板的后缀.
    spring.freemarker.suffix=.ftl
    # 设定模板的加载路径,多个以逗号分隔,默认:
    spring.freemarker.template-loader-path=classpath:/templates/
    # 设定FreeMarker keys.
    spring.freemarker.settings.template_update_delay=0
    spring.freemarker.settings.default_encoding=UTF-8
    spring.freemarker.settings.classic_compatible=true
    
    
    # keycloak安装服务器的IP和端口
    keycloak.auth-server-url=http://localhost:8080/auth
    # realm名称
    keycloak.realm=SpringBoot
    keycloak.public-client=true
    # clientID名称
    keycloak.resource=product-app
    
    # 安全约束
    keycloak.securityConstraints[0].authRoles[0]=user
    keycloak.securityConstraints[0].securityCollections[0].name= common user
    keycloak.securityConstraints[0].securityCollections[0].patterns[0]=/products/*
    

    这样我们就都设置好了,可以把应用程序运行起来了!

    要运行这个 Spring Boot 应用程序,有很多方式可以选择。使用 Maven 的话,你可以简单地像下面这样做就行了:

    mvn clean spring-boot:run
    

    访问“products”链接,会被重定向到 Keycloak 登录页面:

    使用我们的用户“user/password”进行登录,用户名和密码验证成功应该会重定向到产品页面,否则会提示用户名密码错误:

    现在你已经使用 Keycloak 为你的第一个 Spring Boot 应用程序加上了防护措施。

    4. 参考

    Spring Boot整合Keycloak快速入门指南

    5. 代码

    微云下载

  • 相关阅读:
    java io系列23之 BufferedReader(字符缓冲输入流)
    java io系列22之 FileReader和FileWriter
    java io系列21之 InputStreamReader和OutputStreamWriter
    java io系列20之 PipedReader和PipedWriter
    java io系列19之 CharArrayWriter(字符数组输出流)
    java io系列18之 CharArrayReader(字符数组输入流)
    java io系列17之 System.out.println("hello world")原理
    java io系列16之 PrintStream(打印输出流)详解
    java io系列15之 DataOutputStream(数据输出流)的认知、源码和示例
    java io系列14之 DataInputStream(数据输入流)的认知、源码和示例
  • 原文地址:https://www.cnblogs.com/ifme/p/12591457.html
Copyright © 2011-2022 走看看