Skip to content

Commit fcc1fcf

Browse files
Add Basic Authentication
1 parent d0bbc09 commit fcc1fcf

File tree

7 files changed

+147
-7
lines changed

7 files changed

+147
-7
lines changed

sample-spring-boot/pom.xml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,16 @@
5959
<artifactId>spring-boot-configuration-processor</artifactId>
6060
<optional>true</optional>
6161
</dependency>
62-
62+
<dependency>
63+
<groupId>org.springframework.boot</groupId>
64+
<artifactId>spring-boot-starter-security</artifactId>
65+
</dependency>
66+
<dependency>
67+
<groupId>org.springframework.security</groupId>
68+
<artifactId>spring-security-test</artifactId>
69+
<scope>test</scope>
70+
</dependency>
71+
6372
<!-- We're using the Servlet Filter instrumentation -->
6473
<dependency>
6574
<groupId>com.sap.hcp.cf.logging</groupId>

sample-spring-boot/src/main/java/com/sap/hcp/cf/logging/sample/springboot/SampleAppSpringBootApplication.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.springframework.boot.autoconfigure.SpringBootApplication;
1010
import org.springframework.boot.web.servlet.FilterRegistrationBean;
1111
import org.springframework.context.annotation.Bean;
12+
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
1213
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
1314

1415
import com.sap.hcp.cf.logging.sample.springboot.keystore.KeyStoreDynLogConfiguration;
@@ -30,15 +31,15 @@ public static void main(String[] args) {
3031
}
3132

3233
/**
33-
* Registers a customized {@link RequestLoggingFilter} with the servlet.
34-
* We inject our own dynamic logging configuration, that contains the public RSA key from our keystore.
34+
* Registers a customized {@link RequestLoggingFilter} with the servlet. We
35+
* inject our own dynamic logging configuration, that contains the public RSA
36+
* key from our keystore.
3537
*
3638
* @param dynLogConfig autowired with {@link KeyStoreDynLogConfiguration}
3739
* @return a registration of the {@link RequestLoggingFilter}
3840
*/
3941
@Bean
40-
public FilterRegistrationBean<MyLoggingFilter> loggingFilter(
41-
@Autowired DynamicLogLevelConfiguration dynLogConfig) {
42+
public FilterRegistrationBean<MyLoggingFilter> loggingFilter(@Autowired DynamicLogLevelConfiguration dynLogConfig) {
4243
FilterRegistrationBean<MyLoggingFilter> registrationBean = new FilterRegistrationBean<>();
4344
registrationBean.setFilter(new MyLoggingFilter(dynLogConfig));
4445
registrationBean.setName("request-logging");
@@ -49,6 +50,7 @@ public FilterRegistrationBean<MyLoggingFilter> loggingFilter(
4950

5051
/**
5152
* Provides a global {@link Clock} instance. Useful for testing.
53+
*
5254
* @return the global clock
5355
*/
5456
@Bean
@@ -57,11 +59,21 @@ public Clock clock() {
5759
}
5860

5961
private class MyLoggingFilter extends CompositeFilter {
60-
62+
6163
private MyLoggingFilter(DynamicLogLevelConfiguration dynLogConfig) {
6264
super(new AddVcapEnvironmentToLogContextFilter(), new AddHttpHeadersToLogContextFilter(),
6365
new CorrelationIdFilter(), new DynamicLogLevelFilter(() -> dynLogConfig),
6466
new GenerateRequestLogFilter());
6567
}
6668
}
69+
70+
/**
71+
* Provides a {@link BCryptPasswordEncoder} for Basic-Auth.
72+
*
73+
* @return the encoder
74+
*/
75+
@Bean
76+
public BCryptPasswordEncoder encoder() {
77+
return new BCryptPasswordEncoder();
78+
}
6779
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.sap.hcp.cf.logging.sample.springboot.config;
2+
3+
import org.springframework.boot.context.properties.ConfigurationProperties;
4+
import org.springframework.context.annotation.Configuration;
5+
6+
@Configuration
7+
@ConfigurationProperties(prefix = "auth.basic")
8+
public class BasicAuthenticationConfiguration {
9+
10+
private String username;
11+
private String password;
12+
13+
public String getUsername() {
14+
return username;
15+
}
16+
17+
public void setUsername(String username) {
18+
this.username = username;
19+
}
20+
21+
public String getPassword() {
22+
return password;
23+
}
24+
25+
public void setPassword(String password) {
26+
this.password = password;
27+
}
28+
29+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.sap.hcp.cf.logging.sample.springboot.security;
2+
3+
public final class Roles {
4+
5+
public static final String USER = "USER";
6+
7+
private Roles() {
8+
}
9+
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.sap.hcp.cf.logging.sample.springboot.security;
2+
3+
import java.io.IOException;
4+
5+
import javax.servlet.http.HttpServletRequest;
6+
import javax.servlet.http.HttpServletResponse;
7+
8+
import org.springframework.security.core.AuthenticationException;
9+
import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
10+
import org.springframework.stereotype.Component;
11+
12+
/**
13+
* Customization for failing authentication.
14+
*/
15+
@Component
16+
public class SampleAppAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {
17+
18+
private static final String REALM_NAME = "Logging-Sample";
19+
20+
@Override
21+
public void commence(HttpServletRequest request, HttpServletResponse response,
22+
AuthenticationException authException) throws IOException {
23+
response.addHeader("WWW-Authenticate", "Basic realm=" + getRealmName());
24+
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
25+
response.getWriter().println("HTTP Status 401 - " + authException.getMessage());
26+
}
27+
28+
@Override
29+
public void afterPropertiesSet() {
30+
setRealmName(REALM_NAME);
31+
super.afterPropertiesSet();
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.sap.hcp.cf.logging.sample.springboot.security;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
6+
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
7+
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
8+
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
9+
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
10+
import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
11+
12+
import com.sap.hcp.cf.logging.sample.springboot.config.BasicAuthenticationConfiguration;
13+
14+
@Configuration
15+
@EnableWebSecurity
16+
public class SampleAppWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
17+
18+
private final BasicAuthenticationConfiguration config;
19+
private final BasicAuthenticationEntryPoint entryPoint;
20+
private final BCryptPasswordEncoder passwordEncoder;
21+
22+
public SampleAppWebSecurityConfigurerAdapter(@Autowired BasicAuthenticationConfiguration config,
23+
@Autowired BasicAuthenticationEntryPoint entryPoint, @Autowired BCryptPasswordEncoder passwordEncoder) {
24+
this.config = config;
25+
this.entryPoint = entryPoint;
26+
this.passwordEncoder = passwordEncoder;
27+
}
28+
29+
/**
30+
* Require basic authentication for all endpoints.
31+
*/
32+
@Override
33+
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
34+
String password = passwordEncoder.encode(config.getPassword());
35+
auth.inMemoryAuthentication().withUser(config.getUsername()).password(password).roles(Roles.USER);
36+
}
37+
38+
@Override
39+
protected void configure(HttpSecurity http) throws Exception {
40+
http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic()
41+
.authenticationEntryPoint(entryPoint);
42+
}
43+
}

sample-spring-boot/src/main/resources/application.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,8 @@ keystore:
99
defaults:
1010
token:
1111
expiration: P2D
12-
issuer: sample-app-spring-boot
12+
issuer: sample-app-spring-boot
13+
auth:
14+
basic:
15+
username: user
16+
password: secret

0 commit comments

Comments
 (0)