IntelliJ IDEA Spring Initializr Keycloak<\/figcaption><\/figure>\n3- Pom.xml’e a\u015fa\u011f\u0131daki kodlar\u0131 ekleyelim.<\/p>\n
<dependencies>\r\n <dependency>\r\n <groupId>org.keycloak<\/groupId>\r\n <artifactId>keycloak-spring-boot-starter<\/artifactId>\r\n <version>15.0.2<\/version>\r\n <\/dependency>\r\n<\/dependencies>\r\n\r\n<dependencyManagement>\r\n <dependencies>\r\n <dependency>\r\n <groupId>org.keycloak.bom<\/groupId>\r\n <artifactId>keycloak-adapter-bom<\/artifactId>\r\n <version>15.0.2<\/version>\r\n <type>pom<\/type>\r\n <scope>import<\/scope>\r\n <\/dependency>\r\n <\/dependencies>\r\n<\/dependencyManagement><\/pre>\nPom.xml’in son hali a\u015fa\u011f\u0131daki gibi olmal\u0131d\u0131r:<\/p>\n
<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\r\n <modelVersion>4.0.0<\/modelVersion>\r\n <parent>\r\n <groupId>org.springframework.boot<\/groupId>\r\n <artifactId>spring-boot-starter-parent<\/artifactId>\r\n <version>2.5.5<\/version>\r\n <relativePath\/> <!-- lookup parent from repository -->\r\n <\/parent>\r\n <groupId>com.example<\/groupId>\r\n <artifactId>SpringBootKeycloak<\/artifactId>\r\n <version>0.0.1-SNAPSHOT<\/version>\r\n <name>SpringBootKeycloak<\/name>\r\n <description>SpringBootKeycloak<\/description>\r\n <properties>\r\n <java.version>11<\/java.version>\r\n <\/properties>\r\n <dependencies>\r\n <dependency>\r\n <groupId>org.keycloak<\/groupId>\r\n <artifactId>keycloak-spring-boot-starter<\/artifactId>\r\n <version>15.0.2<\/version>\r\n <\/dependency>\r\n <dependency>\r\n <groupId>org.springframework.boot<\/groupId>\r\n <artifactId>spring-boot-starter-security<\/artifactId>\r\n <\/dependency>\r\n <dependency>\r\n <groupId>org.springframework.boot<\/groupId>\r\n <artifactId>spring-boot-starter-web<\/artifactId>\r\n <\/dependency>\r\n\r\n <dependency>\r\n <groupId>org.springframework.boot<\/groupId>\r\n <artifactId>spring-boot-starter-test<\/artifactId>\r\n <scope>test<\/scope>\r\n <\/dependency>\r\n <dependency>\r\n <groupId>org.springframework.security<\/groupId>\r\n <artifactId>spring-security-test<\/artifactId>\r\n <scope>test<\/scope>\r\n <\/dependency>\r\n <\/dependencies>\r\n\r\n <dependencyManagement>\r\n <dependencies>\r\n <dependency>\r\n <groupId>org.keycloak.bom<\/groupId>\r\n <artifactId>keycloak-adapter-bom<\/artifactId>\r\n <version>15.0.2<\/version>\r\n <type>pom<\/type>\r\n <scope>import<\/scope>\r\n <\/dependency>\r\n <\/dependencies>\r\n <\/dependencyManagement>\r\n\r\n <build>\r\n <plugins>\r\n <plugin>\r\n <groupId>org.springframework.boot<\/groupId>\r\n <artifactId>spring-boot-maven-plugin<\/artifactId>\r\n <\/plugin>\r\n <\/plugins>\r\n <\/build>\r\n\r\n<\/project>\r\n<\/pre>\n <\/p>\n
5- Son olarak application.properties dosyas\u0131na a\u015fa\u011f\u0131daki parametreleri ekleyelim.<\/p>\n
keycloak.auth-server-url=http:\/\/localhost:8085\/auth\r\nkeycloak.realm=demo\r\nkeycloak.resource=demo-app\r\nkeycloak.public-client=true<\/pre>\nkeycloak.auth-server-url -> Keycloak url adresi<\/p>\n
keycloak.realm -> Olu\u015fturdu\u011fumuz Realm ad\u0131<\/p>\n
keycloak.resource -> Olu\u015fturdu\u011fumuz client ID<\/p>\n
keycloak.public-client -> Olu\u015fturdu\u011fumuz client Public oldu\u011fu i\u00e7in bunu true olarak belirledik. Bu k\u0131s\u0131m client’\u0131n access type alan\u0131na g\u00f6re de\u011fi\u015ftirilebilir. Biz demo uygulama yapt\u0131\u011f\u0131m\u0131z i\u00e7in \u015fimdilik public.<\/p>\n
6- GloabalSecurityConfiguration ad\u0131nda bir s\u0131n\u0131f olu\u015ftural\u0131m ve KeycloakWebSecurityConfigurerAdapter s\u0131n\u0131f\u0131n\u0131 extend edelim.<\/p>\n
package com.example.springbootkeycloak;\r\n\r\nimport org.keycloak.adapters.KeycloakConfigResolver;\r\nimport org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver;\r\nimport org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;\r\nimport org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.context.annotation.Bean;\r\nimport org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;\r\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\r\nimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;\r\nimport org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;\r\nimport org.springframework.security.core.session.SessionRegistryImpl;\r\nimport org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;\r\nimport org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;\r\n\r\n@EnableWebSecurity\r\npublic class GloabalSecurityConfiguration extends KeycloakWebSecurityConfigurerAdapter {\r\n\r\n @Bean\r\n @Override\r\n protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {\r\n return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());\r\n }\r\n\r\n @Bean\r\n public KeycloakConfigResolver KeycloakConfigResolver() {\r\n return new KeycloakSpringBootConfigResolver();\r\n }\r\n\r\n @Override\r\n protected void configure(HttpSecurity http) throws Exception {\r\n super.configure(http);\r\n http.authorizeRequests()\r\n .antMatchers(\"\/\").permitAll()\r\n .anyRequest().authenticated();\r\n }\r\n\r\n @Autowired\r\n public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {\r\n KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();\r\n keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());\r\n auth.authenticationProvider(keycloakAuthenticationProvider);\r\n }\r\n}\r\n<\/pre>\n <\/p>\n
7- Son olarak REST endpointi tan\u0131mlayal\u0131m. hello adresine bir istek gitti\u011finde kullan\u0131c\u0131 login sayfas\u0131na y\u00f6nlenecek ve logout sayfas\u0131na gidildi\u011finde olu\u015fturulan oturum silinecek ve tekrardan login sayfas\u0131na y\u00f6nlenmi\u015f olacak. getName() metodu ile kullan\u0131c\u0131 giri\u015f yapt\u0131ktan sonra ismini ekrana basm\u0131\u015f olduk.<\/p>\n
package com.example.springbootkeycloak;\r\n\r\nimport org.keycloak.KeycloakPrincipal;\r\nimport org.keycloak.KeycloakSecurityContext;\r\nimport org.keycloak.representations.AccessToken;\r\nimport org.springframework.http.HttpStatus;\r\nimport org.springframework.http.ResponseEntity;\r\nimport org.springframework.security.core.Authentication;\r\nimport org.springframework.web.bind.annotation.GetMapping;\r\nimport org.springframework.web.bind.annotation.RestController;\r\n\r\nimport javax.servlet.ServletException;\r\nimport javax.servlet.http.HttpServletRequest;\r\nimport javax.servlet.http.HttpServletResponse;\r\n\r\n\r\n@RestController\r\npublic class HelloController {\r\n\r\n\r\n @GetMapping(\"\/hello\")\r\n public ResponseEntity<String> hello(Authentication authentication){\r\n\r\n if (authentication.getPrincipal() instanceof KeycloakPrincipal) {\r\n KeycloakPrincipal<KeycloakSecurityContext> kp = (KeycloakPrincipal<KeycloakSecurityContext>) authentication.getPrincipal();\r\n AccessToken token = kp.getKeycloakSecurityContext().getToken();\r\n final String body = \"Hi, \" + token.getName();\r\n return ResponseEntity.ok(body);\r\n }\r\n return new ResponseEntity<>(\"Unauthorized\", HttpStatus.UNAUTHORIZED);\r\n }\r\n\r\n @GetMapping(path = \"\/logout\")\r\n public void logout(HttpServletRequest request, HttpServletResponse httpServletResponse) throws ServletException {\r\n request.logout();\r\n httpServletResponse.setHeader(\"Location\", \"\/hello\");\r\n httpServletResponse.setStatus(302);\r\n }\r\n}\r\n<\/pre>\n <\/p>\n
T\u00fcm a\u015famalar\u0131 tamamlam\u0131\u015f olduk. \u015eimdiyse test edelim.<\/p>\n
Uygulama Testi<\/h2>\n Spring projemizi run edelim ve http:\/\/localhost:8080\/hello\/ adresine istek atal\u0131m. Kar\u015f\u0131m\u0131za login sayfas\u0131 gelecek. Olu\u015fturdu\u011fumuz kullan\u0131c\u0131 ile login olal\u0131m. Giri\u015f yapt\u0131ktan sonra http:\/\/localhost:8080\/logout adresine giderek \u00e7\u0131k\u0131\u015f yapabilirsiniz.<\/p>\nKeycloak Spring Boot Login<\/figcaption><\/figure>\nKeycloak Spring Boot Login<\/figcaption><\/figure>\n