Keycloak是RedHat的开源身份和访问管理解决方案,本文介绍如何在咱们的微服务安全模块中使用keycloak,特别是基于SpringBoot的微服务。spring
它提供了身份和访问管理的有用功能:数据库
虽然安全性是任何应用程序的一个重要方面,但安全性的实现部分是复杂和困难的。一般,它在代码中常常被忽略或执行不当和干扰。json
开发人员须要安全服务器,容许外包和受权认证和受权方面。他们想要一种可以自动开发应用程序安全功能的工具,这一般是一项复杂的任务。后端
Keycloak是最有前途的开源IDAM(身份和访问管理)服务器之一,它与任何技术无关,能够在本身的基础架构中轻松部署/适应。浏览器
Keycloak尝试解决基于REST的Web应用程序和Web服务的单点登陆。Keycloak的最终目标是使安全性足够简单,以便做为服务和应用程序中的安全模块插入。安全功能很混乱,当开发人员手动为本身编写时,它会变得更危险,更容易出错。Keycloak经过提供开箱即用的安全功能帮助咱们,而且能够根据任何组织的个性化需求轻松定制。安全
Keycloak能够帮助咱们在应用程序中引入这些功能:服务器
有不一样的方法来安装keycloak。最简单的是只需下载Keycloak,这是一种独立的安装模式,只需将其解压缩便可。你完成了!如今打开一个终端并转到解压缩的Keycloak服务器并导航到bin目录 - 而后只需运行如下命令:session
./standalone.sh(bat)架构
安装完成后,打开浏览器并转到http:// localhost:8080 / auth。app
默认状况下,Keycloak附带一个H2数据库,但若是你选择RDMS,你可使用带有RDMS的Keycloak。
因为您是第一次运行服务器,所以您必须建立管理员用户。让咱们建立一个管理员用户,其中“admin”做为用户名,“admin”做为密码。
在Keycloak中,领域是您定义客户端的地方。这意味着这些客户端是将由Keycloak保护的应用程序 - 多是Web应用程序或Spring Boot。
注意:'Master'是Keycloak的默认领域。让咱们只需点击“添加领域”按钮便可建立新领域
Spring Boot应用程序是您的客户端。就这么简单。在Keycloak中,客户端是使用Keycloak保护的应用程序。
让咱们看看如何在Keycloak中建立客户端:
在下一个屏幕上将全部内容保持为默认值,您须要的只是输入一个有效的重定向URL,Keycloak将在该应用程序中对用户进行身份验证时使用该URL。咱们将选择在有效的重定向URL部分中保留http:// localhost:8081/*。
您如今可能正在使用当前项目中的REST API。别担忧,Keycloak提供对REST API的彻底支持。实际上,它还提供了一个完整的管理控制台,能够经过REST API使用。
这是可能的Keycloak管理REST API列表。
对于管理REST API,有一个Java客户端库,能够很容易地与Java一块儿使用。要从您的应用程序中使用它 - 就像您对任何第三方库所作的那样 - 只需在项目中添加keycloak-admin-client库的依赖项。而已。
<dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-admin-client</artifactId> <version>3.2.1.Final</version> </dependency>
application.yml配置:
server: port: 9999 keycloak: url: http://localhost:8080/auth realm: master username: admin password: admin clientId: admin-cli
注意:咱们须要clientId做为admin-cli
,这由keycloak提供的全部默认客户端ID,用于实现keycloak为admin提供的REST端点,
使用REST端点在域中建立用户有几个步骤:
第1步:经过getInstance()方法使用主管理员的详细信息建立实例
Keycloak kcMaster = Keycloak.getInstance(serverUrl, masterRealm, masterUsername, masterPassword, masterClientId);
第2步:在UserRepresentation中设置用户数据
private String userName; private String firstName; private String lastName; private String email; private String password; private String companyName;
密码映射到CredentialRepresentation。您必须强制用户在首次登陆时经过如下代码更改密码:
credential.setTemporary(isTempPassword); and user.setRequiredActions(Arrays.asList(ACTION_UPDATE_PASSWORD));
最后,您所要作的就是在给定领域中调用createUser:
kcMaster.realm(request.getCompanyName()).users().create(user);
因为Keycloak拥有本身的数据库,所以新建立的用户信息存储在表中:user_entity
恭喜!您刚刚使用REST端点在Keyclaok中建立了一个用户。
如今遇到一个重大挑战:将用户登陆到您的应用程序中
Keycloak根据您在Keycloak中配置客户端的方式提供了几种获取访问令牌的方法。Keycloak为您提供AccessTokenResponse,它是一个基于JWT的令牌,包含访问令牌,刷新令牌和这些属性的相关信息。
@PostMapping(path = "/login", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) public AccessTokenResponse getToken(@RequestBody Map<String, Object> credentials) { Keycloak kc = Keycloak.getInstance(serverUrl, (String credentials.get("company"), (String) credentials.get("username"), (String) credentials.get("password"), (String) credentials.get("clientId")); return kc.tokenManager().getAccessToken(); }
您能够从新检查详细数据,该数据嵌入了jwt.io上的访问令牌
Keycloak知道本身的API与应用程序的交互,并为愿意与Keycloak通讯的应用程序提供适配器。它已经为Javascript,NodeJs应用程序,WildFly / EAP和Spring Boot提供了适配器。Spring-boot的keycloak依赖(源代码)
关于安全配置:
若是您是后端开发人员并且您正在使用Spring,而且您必须处理与安全相关的任务,那么您确定使用Spring Security。好吧,有一个好消息:有一个Keycloak Spring安全适配器,它包含在Spring Boot keycloak starter中。
若是您使用过Spring Security,那么您可能知道SecurityConfig类扩展了WebSecurityConfigurerAdapter。这是为建立WebSecurityConfigurer实例提供了方便的基类,而且任何使用Spring Security的应用程序都须要它。Keycloak在WebSecurityConfigurerAdapter上提供了一个包装类,名为KeycloakWebSecurityConfigurerAdapter。
如今让咱们看看如何将Spring Security和Keycloak结合在一块儿。
首先,咱们须要在pom.xml中添加spring-boot-starter-security工件来获取Spring Security库:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
@Configuration @EnableWebSecurity @ComponentScan(basePackageClasses = KeycloakSecurityComponents.class) public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider(); keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper()); auth.authenticationProvider(keycloakAuthenticationProvider); } @Bean public KeycloakConfigResolver KeycloakConfigResolver() { return new KeycloakSpringBootConfigResolver(); } @Bean @Override protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl()); } @Override protected void configure(HttpSecurity http) throws Exception { super.configure(http); http .authorizeRequests() .antMatchers("/features*").hasRole("user") .anyRequest().permitAll(); } }
让咱们仔细看看最重要的方法:
在您的应用程序中构建安全组件老是很困难,特别是当它是基于微服务的架构时。固然有多种选择可用于构建安全服务,但Keycloak承担这一责任并帮助开发人员专一于产品或应用程序所需的内容。
因为Keycloak中的每一个组件都通过了很好的尝试和测试,所以在安全模块方面遇到任何麻烦的可能性都很小。
Keycloak确实为Spring开发人员提供了处理安全性的巨大潜力,特别是在开发正朝着构建微服务战略的方向发展时。