This commit is contained in:
ialbert 2022-08-01 13:10:19 +03:00
parent 3e5ca28b21
commit f968c21992
7 changed files with 165 additions and 4 deletions

View file

@ -4,9 +4,9 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>backend-api</artifactId>
<name>Clearing Frontend API</name>
<description>Clearing frontend API module</description>
<packaging>war</packaging>
<name>Clearing Backend API</name>
<description>Clearing backend API module</description>
<packaging>jar</packaging>
<parent>
<artifactId>clearing-parent</artifactId>
@ -55,8 +55,13 @@
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<mainClass>ru.spcex.clearing.backendapi.BackendApiApplication</mainClass>
</manifest>
<manifestEntries>
<Built-By>Maven</Built-By>
</manifestEntries>
</archive>
<webResources>
<resource>
@ -82,6 +87,26 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
<!-- <execution>-->
<!-- <id>gather-build-info-web</id>-->
<!-- <goals>-->
<!-- <goal>build-info</goal>-->
<!-- </goals>-->
<!-- </execution>-->
</executions>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>

View file

@ -0,0 +1,30 @@
package ru.spcex.clearing.backendapi.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import java.time.Duration;
@Configuration
public class RestTemplateConfig {
private final RestTemplateBuilder builder;
@Autowired
public RestTemplateConfig(RestTemplateBuilder builder) {
this.builder = builder;
}
/**
* В настоящий момент используется для выгрузки AFS данных
*/
@Bean("clearing-rest")
public RestTemplate restTemplate() {
return builder
.setConnectTimeout(Duration.ofMillis(10000))
.setReadTimeout(Duration.ofMillis(40000))
.build();
}
}

View file

@ -0,0 +1,48 @@
package ru.spcex.clearing.backendapi.controller;
import org.keycloak.KeycloakSecurityContext;
import org.keycloak.adapters.RefreshableKeycloakSecurityContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.client.RestTemplate;
import ru.spcex.clearing.backendapi.security.TokenRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
@Controller
@RequestMapping("/backend-api-login")
public class LoginController {
private final RestTemplate restTemplate;
@Autowired
public LoginController(@Qualifier("clearing-rest") RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@RequestMapping(value = "/perform-login", method = RequestMethod.POST)
public ResponseEntity<Map<String, Object>> refreshToken(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
RefreshableKeycloakSecurityContext session = (RefreshableKeycloakSecurityContext) httpServletRequest.getSession().getAttribute(KeycloakSecurityContext.class.getName());
String login = httpServletRequest.getHeader("clearing-login");
String password = httpServletRequest.getHeader("clearing-password");
HttpEntity<MultiValueMap<String, String>> request =
new TokenRequest.Builder()
.username(login)
.password(password)
.build();
ResponseEntity<String> response = restTemplate.postForEntity(
"http://10.200.200.147:8080/realms/master/protocol/openid-connect/token",
request, String.class);
return null;
}
}

View file

@ -0,0 +1,15 @@
package ru.spcex.clearing.backendapi.security;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;
@Component
public class SimpleUserDetailService
// implements UserDetailsService
{
// @Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return null;
}
}

View file

@ -0,0 +1,38 @@
package ru.spcex.clearing.backendapi.security;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.util.Collections;
public class TokenRequest {
public static class Builder{
MultiValueMap<String, String> data;
public Builder(){
data = new LinkedMultiValueMap<>();
data.put("client_id", Collections.singletonList("clearing"));
data.put("grant_type", Collections.singletonList("password"));
data.put("client_secret", Collections.singletonList("WnOVCxcAmrUYc8IjiFHOuRif5Oesoyfr"));
}
public Builder username(String username){
data.put("username", Collections.singletonList(username));
return this;
}
public Builder password(String password){
data.put("password", Collections.singletonList(password));
return this;
}
public HttpEntity<MultiValueMap<String, String>> build(){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
return new HttpEntity<>(data, headers);
}
}
private TokenRequest(){
}
}

View file

@ -44,10 +44,15 @@ public class WebSecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http
// .formLogin()
// .loginProcessingUrl("/backend-api-login/perform-login")
// .and()
.csrf().disable()
.authorizeRequests()
.antMatchers("/anonymous/**").permitAll()
.antMatchers("/sso/login").permitAll()
.antMatchers("/error").permitAll()
.antMatchers("/backend-api-login/**").permitAll()
.anyRequest().hasAnyRole("admin");
}
}

View file

@ -8,7 +8,7 @@
"cors-max-age" : 1000,
"cors-allowed-methods" : "POST, PUT, DELETE, GET",
"cors-exposed-headers" : "WWW-Authenticate, My-custom-exposed-Header",
"bearer-only" : false,
"bearer-only" : true,
"enable-basic-auth" : false,
"expose-token" : false,
"verify-token-audience" : true,