使用 Keycloak 保护 Spring Boot 应用程序

x33g5p2x  于2022-09-15 转载在 Spring  
字(4.5k)|赞(0)|评价(0)|浏览(380)

本教程介绍使用 Keycloak 保护 Spring Boot 应用程序。 Keycloak 是一个开源身份和访问管理解决方案,旨在保护应用程序和服务。用户可以使用 Keycloak 进行身份验证,而不是编写单个应用程序。因此,应用程序不必处理登录身份验证表单以及应用程序代码中的其他安全问题。让我们看看如何将 Keycloak 安全性添加到 Spring Boot 应用程序中。

设置Keycloak

有几个选项可以开始使用 Keycloak。您可以从 https://www.keycloak.org/downloads 下载最新版本

除此之外,您可以简单地将 Keycloak 作为 Docker 容器映像启动:

docker run --rm     --name keycloak    -e KEYCLOAK_USER=admin    -e KEYCLOAK_PASSWORD=admin \     -p 8180:8180    -it quay.io/keycloak/keycloak    -b 0.0.0.0    -Djboss.http.port=8180

从服务器启动的日志中检查:

13:17:59,268 INFO  [org.jboss.as.server] (ServerService Thread Pool -- 46) WFLYSRV0010: Deployed "keycloak-server.war" (runtime-name : "keycloak-server.war") 13:17:59,317 INFO  [org.jboss.as.server] (Controller Boot Thread) WFLYSRV0212: Resuming server 13:17:59,319 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: Keycloak 12.0.2 (WildFly Core 13.0.3.Final) started in 17105ms - Started 687 of 972 services (687 services are lazy, passive or on-demand) 13:17:59,321 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management 13:17:59,321 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990

现在我们将创建一个带有客户端身份验证策略的 Keycloak 领域。您可以访问 Keycloak 的管理控制台(在我们的示例中为 http://localhost:8180),或者您可以只使用以下 script.sh:

#!/bin/bash  cd /opt/jboss/keycloak/bin   ./kcadm.sh config credentials --server http://localhost:8180/auth --realm master --user admin --password admin  ./kcadm.sh create realms -s realm=spring-realm -s enabled=true -o  ./kcadm.sh create users -r spring-realm -s username=demo -s enabled=true  ./kcadm.sh set-password -r spring-realm --username demo --new-password demo  ./kcadm.sh create clients -r spring-realm -s clientId=simple-webapp -s publicClient="true"  -s "redirectUris=[\"http://localhost:8080/*\"]" -s enabled=true  ./kcadm.sh create roles -r spring-realm -s name=Users  ./kcadm.sh add-roles --uusername demo --rolename Users -r spring-realm

该脚本调用Keycloak CLI (kcadm.sh) 来执行创建“spring-realm”所需的所有步骤。要执行它,您可以附加到 Docker 进程并上传并执行它,如下所示:

docker cp script.sh keycloak:/opt/jboss/keycloak/bin docker exec -it keycloak chmod 755 /opt/jboss/keycloak/bin/script.sh docker exec -it keycloak /opt/jboss/keycloak/bin/script.sh

您应该从脚本日志中看到执行成功完成:

. . . . Created new user with id '75e22b77-fd58-4744-b07e-3687aa8d9fc9' Created new client with id '506ff918-5135-492d-8ee0-9a26211090fe' Created new role with id 'Users'

设置 Spring Boot 应用程序

现在让我们设置一个最小的 Spring Boot 应用程序,它有一个针对 Keycloak 领域的控制器。这是我们的基本控制器:

@Controller
class CustomerController {
  @GetMapping(path = "/customers")
  public String getCustomers(Model model) {
    model.addAttribute("customers", Arrays.asList("John Smith", "Uncle Tom", "Fred Flintstone"));
    return "customers";
  }

  @GetMapping(path = "/logout")
  public String logout(HttpServletRequest request) throws ServletException {
    request.logout();
    return "/";
  }
}

最有趣的部分是 application.properties 文件,其中包含 Keycloak 设置,这些设置基于我们刚刚创建的 Realm URL:

keycloak.auth-server-url=http://localhost:8180/auth keycloak.realm=spring-realm keycloak.resource=simple-webapp keycloak.public-client=true keycloak.security-constraints[0].authRoles[0]=Users keycloak.security-constraints[0].securityCollections[0].patterns[0]=/customers/*

为了构建和部署应用程序,我们需要添加标准的 web 和测试启动器以及 keycloak-spring-boot-starter

<?xml version="1.0" encoding="UTF-8"?><project>
   	
   <dependencies>
       		
      <dependency>
          			
         <groupId>org.springframework.boot</groupId>
          			
         <artifactId>spring-boot-starter-freemarker</artifactId>
          		
      </dependency>
       		
      <dependency>
          			
         <groupId>org.keycloak</groupId>
          			
         <artifactId>keycloak-spring-boot-starter</artifactId>
          		
      </dependency>
       		
      <dependency>
          			
         <groupId>org.springframework.boot</groupId>
          			
         <artifactId>spring-boot-starter-web</artifactId>
          		
      </dependency>
        		
      <dependency>
          			
         <groupId>org.springframework.boot</groupId>
          			
         <artifactId>spring-boot-starter-test</artifactId>
          			
         <scope>test</scope>
          		
      </dependency>
       	
   </dependencies>
     	
   <dependencyManagement>
       		
      <dependencies>
          			
         <dependency>
             				
            <groupId>org.keycloak.bom</groupId>
             				
            <artifactId>keycloak-adapter-bom</artifactId>
             				
            <version>${keycloak.version}</version>
             				
            <type>pom</type>
             				
            <scope>import</scope>
             			
         </dependency>
          		
      </dependencies>
       	
   </dependencyManagement>
    
</project>

运行应用程序:

$ mvn install spring-boot:run

现在尝试访问 /customers URL:http://localhost:8080/customers。来自 Keycloak 的登录页面将显示:

如果您输入凭据“demo/demo”,您将可以访问主应用程序页面:

就这样!我们完成了对Keycloak的快速入门。

本教程的源代码:https://github.com/fmarchioni/masterspringboot/tree/master/security/keycloak-demo

相关文章

微信公众号

最新文章

更多