使用Spring Boot快速搭建Keycloak Client

前言

   本文将简单介绍如何配置一个Keycloak服务,并搭建一个Spring boot 应用访问Keycloak。

准备

   在开始之前,需要一个已经搭建完成的KeyCloak Service。具体的搭建教程可以参考我的上篇文章SSO单点登录系统的搭建——Keycloak。

配置Keycloak服务

  1. 使用管理员账号登录keycloak的Administration Console。

  2. 添加一个Realm。
       realm可以理解为领域。创建的各个领域之间的数据互不干扰。
       将光标移到Master所在区域,这样就会出现添加realm的按钮。
    使用Spring Boot快速搭建Keycloak Client_第1张图片

       输入一个Realm的名字完成realm的添加。
    使用Spring Boot快速搭建Keycloak Client_第2张图片

  3. 添加一个客户端(Client)
       在左侧菜单栏中选择Clients 选项卡。然后点击右侧的添加按钮。
    使用Spring Boot快速搭建Keycloak Client_第3张图片
       输入客户端名称,然后点击保存。
    使用Spring Boot快速搭建Keycloak Client_第4张图片
       然后,在添加成功后的跳转到的页面找到Valid Redirect URIs ,在这里将配置我们的spring boot 应用的网址。在本示例中,spring boot应用将会跑在8081端口上。所以地址应设置为http://localhost:8081。随后保存。
    使用Spring Boot快速搭建Keycloak Client_第5张图片

  4. 添加角色
       在左侧菜单栏中选择Roles 选项卡。然后点击右侧的添加按钮。
       输入用户名,然后保存。
    使用Spring Boot快速搭建Keycloak Client_第6张图片

  5. 添加用户
       在左侧菜单栏中选择Users 选项卡。然后点击右侧的添加按钮。使用Spring Boot快速搭建Keycloak Client_第7张图片
       输入用户名添加用户
    使用Spring Boot快速搭建Keycloak Client_第8张图片
       添加成功后,单击Credentials 选项卡,设置登录密码。
    使用Spring Boot快速搭建Keycloak Client_第9张图片
       添加成功后,单击Role Mappings 选项卡,给用户设置角色。
    使用Spring Boot快速搭建Keycloak Client_第10张图片

  6. 测试
       到了这一步在KeyCloak Service中配置就算是完成了。现在我们能够通过api(在我尝试的情况来看17.0.1版的接口地址和网络上大多数教程提供的地址不一致)来获取token了。
    使用post方式请求这个api。

    http:///realms/<你所创建的 realm 名称>/protocol/openid-connect/token
    示例:http://localhost:8080/realms/MyRealm/protocol/openid-connect/token

       这个请求的body中需要添加x-www-form-urlencoded参数。

    client_id:
    username:
    password:
    grant_type:password

       这样Keycloak就会返回access_token和refresh_token。使用access_token就能访问被保护的资源了。
       realm更多的信息可以参考http://localhost:8080/realms/<你所创建的 realm 名称>/.well-known/openid-configuration

  7. 开启用户注册(可选)
       在左侧菜单栏中选择Realm Settings 选项卡。然后按照如图所示进行操作。使用Spring Boot快速搭建Keycloak Client_第11张图片
       这样在KeyCloak的登录页面就会增加注册按钮。

创建一个Spring Boot 应用

  1. 添加以下依赖

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.keycloak.bomgroupId>
                <artifactId>keycloak-adapter-bomartifactId>
                <version>17.0.1version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-securityartifactId>
        dependency>
        <dependency>
            <groupId>org.keycloakgroupId>
            <artifactId>keycloak-spring-boot-starterartifactId>
            <version>17.0.1version>
        dependency>
       
    
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
    dependencies>
    
  2. Controller

    @Controller
    public class MyController {
    
        @GetMapping("/customers/he")
        @ResponseBody
        public Map he(Principal principal){
            Map<String, String> map = new HashMap<>();
            map.put("username",principal.getName());
            return map;
        }
        
    }
    
  3. SecurityConfig

    @KeycloakConfiguration
    public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
    @Autowired
    public void configureGlobal(
            AuthenticationManagerBuilder auth) throws Exception {
    
        KeycloakAuthenticationProvider keycloakAuthenticationProvider
                = keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(
                new SimpleAuthorityMapper());
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }
    
    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    }
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests()
        //注意这句 这个user角色是我们在Keycloak中创建并分配给用户的, 只有用户拥有该role时,用户才能访问对应的资源
                .antMatchers("/customers/*").hasRole("user") 
                .anyRequest()
                .permitAll();
    }
    
    
  4. KeycloakConfig

    @Configuration
    public class KeycloakConfig {
        @Bean
    	public KeycloakSpringBootConfigResolver keycloakConfigResolver() {
        	return new KeycloakSpringBootConfigResolver();
    	}
    }
    
  5. application.yml

server:
  port: 8081 #与keycloak中配置的一致

keycloak:
  auth-server-url: http://localhost:8080  #KeyCloak地址
  realm: MyRealm  #realm名称
  resource: spring-app #client名称
  public-client: true
  principal-attribute: preferred_username
  ssl-required: external
  1. 测试
    这样我们就能测试我们刚写好的api了。发送以下请求。

curl --location --request GET ‘http://localhost:8081/he’
–header ‘Authorization: Bearer <刚刚获取的access_token>’

你可能感兴趣的:(java,spring,boot,spring)