Spring 부트 응용 프로그램에서 KeyClope 사용 방법
13633 단어 springbootspringsecuritykeycloakjava
이 프레젠테이션을 시작하려면 다음이 필요합니다.
열쇠 망토는 무엇입니까?
Keycloak은 현대 응용 프로그램과 서비스를 위한 소스 ID 및 액세스 관리 솔루션입니다.Keyclope는 SAML 및 OpenID 프로토콜 솔루션을 제공합니다.
우리는 왜 keydepage를 사용해야 합니까?
앞에서 말한 바와 같이,keydepeat는 신분과 접근 관리를 제공하며, 이것도 원본이다.SAML 및 OpenID 프로토콜은 업계 표준입니다.KeyClope와 통합된 애플리케이션을 구축하면 보다 안전하고 안정적인 솔루션을 제공할 수 있습니다.물론 Gluu, Shibboleth, WSO2와 같은 다른 사용 가능한 해결 방안도 있다.
이 글에서, 우리는 키드포트를 사용할 것이다.
KeyClope를 사용하여 Spring Boot 애플리케이션 보호
이 프레젠테이션에는 두 가지 섹션이 있습니다.하나는 열쇠 망토에 관한 거예요.두 번째는 Keydepeat으로 Spring 부트 응용 프로그램을 보호하는 것입니다.
Keyclope 설치
컴퓨터에서 Keycloak을 다운로드하십시오.다운로드한 파일의 압축을 풀고 명령 프롬프트에서 bin 디렉터리에서 다음 명령을 사용하여 서버를 실행합니다. (윈도우즈 컴퓨터에 있습니다.)
standalone.bat -Djboss.socket.binding.port-offset=100
그러면 로컬 시스템에서 KeyClope를 위한 Wildfly 서버가 시작됩니다.URL http://localhost:8180
을 실행하여 서버에 액세스할 수 있습니다.단편판만 쓰면bat이 인자가 없는 상태에서 실행하려면 서버는 포트 8080
에서 실행됩니다.서버를 시작하면 관리자를 만드는 것이 우선입니다.사용자 관리자와 비밀번호 d#n3q2b를 만들 것입니다.
이제 관리 콘솔에 액세스하여 사용자 세부 정보를 입력합니다.관리자로 로그인하면 다음과 같은 첫 번째 화면이 표시됩니다.
응용 프로그램 추가
초기 화면에 기본 영역이 표시됩니다.프레젠테이션 목적으로 우리는 새로운 영역
SpringBootKeycloakApp
을 만들 것이다.이 영역에서는 Spring 부트 응용 프로그램을 클라이언트로 추가합니다.클라이언트 탭에서 새 클라이언트를 만듭니다.우리는 우리의 클라이언트 응용 프로그램을 SpringBoot App으로 명명할 것이다.현재 settings에서, 우리는 Spring Boot 응용 프로그램에 리디렉션 URL을 추가할 것입니다.이 URL은 검증된 후 KeyClope에서 응용 프로그램으로 방향을 변경합니다.그 밖에 우리는 오픈id 연결을 프로토콜로 사용하여 이 실현의 일부분으로 한다.
사용자 추가 중
이제 인증에 사용할 사용자를 추가합니다.이 사용자를 사용하여 Spring 부트 응용 프로그램에 로그인합니다.
KeyClope의 역할 탭에서 사용자
ROLE_User
에 필요한 역할을 추가합니다.완료되면 사용자 탭으로 이동하여 새 사용자를 추가합니다.역할 매핑 탭에서 이 사용자에게 새로 만든 역할을 추가해야 합니다.
Spring 부트 응용 프로그램 만들기
이제 KeyClope를 사용하여 보안을 실현하는 간단한 Spring 부트 응용 프로그램을 만듭니다.이 프로그램의 일부로서, 우리는 이 프로그램을 사용하여 인증을 할 사용자를 위해 업무 목록 작업의 목록을 표시할 것입니다.
이 응용 프로그램을 구축하려면 다음과 같은 종속성이 필요합니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.keycloak:keycloak-spring-boot-starter'
runtimeOnly 'mysql:mysql-connector-java'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
testImplementation 'org.springframework.security:spring-security-test'
}
보시다시피 저희는 spring-boot
과 spring-security
및 keycloak-spring-boot-starter
의존항을 사용합니다.keydeport 의존항은 keydeport 클라이언트 어댑터를 포함합니다.우리는 이 어댑터를 사용하여 인증을 진행할 것이다.표준 Spring 보안 어댑터를 대체합니다.이
keycloak-spring-boot-starter
의존항이 정상적으로 작동하는지 확인하기 위해서gradle 파일에 추가 의존항을 추가해야 합니다. 아래와 같습니다.dependencyManagement {
imports {
mavenBom "org.keycloak.bom:keycloak-adapter-bom:11.0.2"
}
}
자세한 내용은 keycloak의 공식 문서를 참조하십시오.우리의 컨트롤러 클래스는 두 가지 중요한 방법이 있습니다. 하나는 누구나 접근할 수 있는 홈페이지를 가져오는 것이고, 다른 하나는 작업 목록을 가져오는 것입니다. 이 작업 목록은 캐릭터role\u 사용자의 인증을 받은 사용자만 접근할 수 있습니다.이 TaskController 코드는 다음과 같습니다.
package com.betterjavacode.keycloakdemo.keycloakdemo.controllers;
import com.betterjavacode.keycloakdemo.keycloakdemo.dto.TaskDto;
import com.betterjavacode.keycloakdemo.keycloakdemo.managers.TaskManager;
import org.keycloak.KeycloakSecurityContext;
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.http.HttpServletRequest;
import java.util.List;
@Controller
public class TaskController
{
private final HttpServletRequest request;
@Autowired
public TaskController(HttpServletRequest request)
{
this.request = request;
}
@Autowired
private TaskManager taskManager;
@GetMapping(value="/")
public String home()
{
return "index";
}
@GetMapping(value="/tasks")
public String getTasks(Model model)
{
List tasks = taskManager.getAllTasks();
model.addAttribute("tasks", tasks);
model.addAttribute("name", getKeycloakSecurityContext().getIdToken().getGivenName());
return "tasks";
}
private KeycloakSecurityContext getKeycloakSecurityContext()
{
return (KeycloakSecurityContext) request.getAttribute(KeycloakSecurityContext.class.getName());
}
}
이 컨트롤러 클래스에서, 우리는 TaskManager
을 사용하여 모든 작업을 얻습니다.내가 KeyCloakSecurityContext
을 전시할 때, 나는 SecurityConfig
을 설명할 것이다.스프링 안전벨트
Spring-Security
을 사용하든 안 사용하든 이 프로그램을 이용해서 키deport를 사용하여 인증을 할 수 있습니다.프레젠테이션의 일부로 Spring-Security
을 사용합니다.Spring 보안 없이 동일한 응용 프로그램을 사용하려면 Spring 보안 의존 항목을 삭제하고 application.properties
파일을 통해 보안 설정을 추가하십시오.이 응용 프로그램에서 KeyClope를 사용하여 인증하려면
application.properties
의 다음 속성이 필요합니다.keycloak.auth-server-url=http://localhost:8180/auth
keycloak.realm=SpringBootKeycloakApp
keycloak.resource=SpringBootApp
keycloak.public-client=true
keycloak.principal-attribute=preferred_username
Spring Security 없이 이 응용 프로그램을 사용하려면 다음 두 가지 속성이 필요합니다.keycloak.security-constraints[0].authRoles[0]=ROLE_User
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/tasks
Spring-Security
을 사용하므로 Java 클래스 SecurityConfig
을 통해 보안 구성을 구성합니다.이 SecurityConfig 클래스는
KeyCloakWebSecurityConfigurerAdapter
확장됩니다.우리의 구성 방법은 다음과 같다.
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception
{
super.configure(httpSecurity);
httpSecurity.authorizeRequests()
.antMatchers("/tasks").hasRole("User")
.anyRequest().permitAll();
}
기본적으로 모든 도착/작업 노드의 요청은 role\uuser로서의 사용자 역할을 가져야 합니다.여기서 ROLE_의 접두사를 가정합니다.다른 요청을 제외하고는 어떠한 권한 수여도 받지 않고 허용될 것이다.이런 상황에서 우리는 색인 페이지를 호출할 것이다.우리는
@KeyCloakConfiguration
의 주석을 사용할 것이다. 이것은 기본적으로 @Configuration
과 @EnableWebSecurity
의 주석을 포함한다.우리의
SecurityConfig
이 KeycloakWebSecurityConfigurerAdapter
으로 확장되었기 때문에, 우리는sessionAuthenticationStrategy와 httpSessionManager를 실현해야 합니다.Spring Security Authentication Manager에 idp 키 망토를 등록해야 합니다.보안 구성은 다음과 같습니다.
package com.betterjavacode.keycloakdemo.keycloakdemo.config;
import org.keycloak.adapters.springsecurity.KeycloakConfiguration;
import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;
import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
import org.keycloak.adapters.springsecurity.management.HttpSessionManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;
import org.springframework.security.core.session.SessionRegistryImpl;
import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
@KeycloakConfiguration
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter
{
@Autowired
public void configureGlobal(AuthenticationManagerBuilder authenticationManagerBuilder)
{
SimpleAuthorityMapper simpleAuthorityMapper = new SimpleAuthorityMapper();
simpleAuthorityMapper.setPrefix("ROLE_");
KeycloakAuthenticationProvider keycloakAuthenticationProvider =
keycloakAuthenticationProvider();
keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(simpleAuthorityMapper);
authenticationManagerBuilder.authenticationProvider(keycloakAuthenticationProvider);
}
@Bean
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy ()
{
return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
}
@Bean
@Override
@ConditionalOnMissingBean(HttpSessionManager.class)
protected HttpSessionManager httpSessionManager()
{
return new HttpSessionManager();
}
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception
{
super.configure(httpSecurity);
httpSecurity.authorizeRequests()
.antMatchers("/tasks").hasRole("User")
.anyRequest().permitAll();
}
}
따라서 Spring Security는 ROLE\u USER와 같은 대문자 역할을 사용하고 항상 ROLE\u 접두사를 사용합니다.이 문제를 해결하기 위해 키clope에 role\uuser 사용자를 위한 캐릭터를 추가했습니다. 그러나 우리는 접두사 하나만 검증할 것입니다. 왜냐하면 우리의 http 설정은 어떻게든 이 캐릭터를 검증할 수 있기 때문입니다.KeyClope를 사용하여 인증을 수행하므로 사용자의 상태를 파악하는 세션이 필요합니다.우리는 이곳에서
RegisterSessionAuthenticationStrategy
을 사용한다.HttpSessionManager
은 조건bean입니다. 왜냐하면 keydepeat가 이미 이 bean을 실현했기 때문입니다.Keyclope Spring 부트 어댑터를 구현하기 위해 다음과 같이
KeyCloakSpringBootConfigResolver
bean을 추가합니다.package com.betterjavacode.keycloakdemo.keycloakdemo.config;
import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class KeycloakConfig
{
@Bean
public KeycloakSpringBootConfigResolver keycloakSpringBootConfigResolver()
{
return new KeycloakSpringBootConfigResolver();
}
}
나는 응용 프로그램 구축의 나머지 부분을 표시하지 않았지만, 이 코드는 GitHub에서 이 프로젝트에 사용할 수 있다.어플리케이션 데모
http://localhost:8180에서 실행되는 KeyClope 응용 프로그램을 실행합니다.Spring Boot 응용 프로그램은 http://localhost:8080에서 실행됩니다.
Spring Boot 응용 프로그램의 첫 번째 화면은 다음과 같습니다.
이제 사용자가 모든 작업 가져오기를 클릭하면 다음과 같이 KeyClope 로그인 화면으로 리디렉션됩니다.
이제 사용자 betterjavacode 사용자 이름과 비밀번호를 입력하면 다음과 같은 작업 목록이 표시됩니다.
인증 프로세스
사용자가 "모든 작업 가져오기"를 누르면 사용자는 Spring Security의 sso/login 단점으로 리디렉션됩니다. Keyclope SpringBootConfigResolver에서 처리하고 Keyclope에 인증 코드 흐름 요청을 보냅니다.
http://localhost:8180/auth/realms/SpringBootKeycloakApp/protocol/openid-connect/auth?response_type=code&client_id=SpringBootApp&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fsso%2Flogin&state=70bd4e28-89e6-43b8-8bea-94c6d057a5cf&login=true&scope=openid
Keyclope는 세션 코드를 사용하여 응답하고 로그인 화면을 표시하기 위해 요청을 처리합니다.사용자가 인증서를 입력하고 키beapt가 인증하면 인증 코드로 응답합니다. 이 코드는 영패로 교환되고 사용자가 로그인합니다.
결론
이 글에서, 나는 당신의 스프링 안내 프로그램을 보호하기 위해 키 deport를 신분 제공자로 사용하는 방법을 보여 줍니다.
이 글의 원본 게시물은 나의 블로그 betterjavacode에 발표되었다
Reference
이 문제에 관하여(Spring 부트 응용 프로그램에서 KeyClope 사용 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/betterjavacode/how-to-use-keycloak-with-a-spring-boot-application-3385텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)