Project

General

Profile

1
package eu.dnetlib.repo.manager.config;
2

    
3
import org.mitre.oauth2.model.ClientDetailsEntity.AuthMethod;
4
import org.mitre.oauth2.model.RegisteredClient;
5
import org.mitre.openid.connect.client.OIDCAuthenticationFilter;
6
import org.mitre.openid.connect.client.OIDCAuthenticationProvider;
7
import org.mitre.openid.connect.client.service.impl.*;
8
import org.mitre.openid.connect.config.ServerConfiguration;
9
import org.springframework.beans.factory.annotation.Value;
10
import org.springframework.context.annotation.Bean;
11
import org.springframework.context.annotation.Configuration;
12
import org.springframework.security.authentication.AuthenticationManager;
13
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
14
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
15
import org.springframework.security.config.annotation.web.builders.WebSecurity;
16
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
17
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
18
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
19
import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;
20

    
21
import java.util.*;
22

    
23
@Configuration
24
@EnableWebSecurity
25
public class AaiSecurityConfiguration extends WebSecurityConfigurerAdapter {
26

    
27
    @Value("${services.provide.aai.oidc.webURL}")
28
    private String logoutSuccessUrl;
29

    
30
    @Value("${services.provide.aai.oidc.issuer}")
31
    private String oidcIssuer;
32

    
33
    @Value("${services.provide.aai.oidc.id}")
34
    private String oidcId;
35

    
36
    @Value("${services.provide.aai.oidc.secret}")
37
    private String oidcSecret;
38

    
39
    @Value("${services.provide.aai.oidc.redirectURL}")
40
    private String oidcDevHome;
41

    
42
    @Value("${services.provide.aai.oidc.webURL}")
43
    private String webAppFrontEnd;
44

    
45
    @Bean
46
    @Override
47
    public AuthenticationManager authenticationManagerBean() throws Exception {
48
        return authenticationManager();
49
    }
50

    
51
    @Override
52
    protected void configure(AuthenticationManagerBuilder auth) {
53
        auth.authenticationProvider(openIdConnectAuthenticationProvider());
54
    }
55

    
56
    @Override
57
    public void configure(WebSecurity web) {
58
        web.ignoring().antMatchers("/stats/**");
59
    }
60

    
61
    @Override
62
    protected void configure(HttpSecurity http) throws Exception {
63
        http
64
                .csrf().disable()
65
                .authorizeRequests()
66
                    .regexMatchers("/actuator/.*").permitAll()
67
                    .regexMatchers("/metrics").permitAll()
68
                    .anyRequest().authenticated()
69
                .and()
70
//                .anonymous().disable()
71
                .httpBasic()
72
                .authenticationEntryPoint(authenticationEntryPoint())
73
                .and()
74
                .logout().logoutUrl("/openid_logout")
75
                .invalidateHttpSession(true)
76
                .deleteCookies("openAIRESession")
77
                .logoutSuccessUrl(logoutSuccessUrl)
78
                .and()
79
                .addFilterBefore(openIdConnectAuthenticationFilter(), AbstractPreAuthenticatedProcessingFilter.class)
80
        ;
81
    }
82

    
83
    @Bean
84
    public OIDCAuthenticationProvider openIdConnectAuthenticationProvider() {
85
        OIDCAuthenticationProvider oidcProvider = new OIDCAuthenticationProvider();
86
        oidcProvider.setAuthoritiesMapper(authoritiesMapper());
87
        return oidcProvider;
88
    }
89

    
90
    @Bean
91
    public OpenAIREAuthoritiesMapper authoritiesMapper() {
92
        OpenAIREAuthoritiesMapper authoritiesMapper = new OpenAIREAuthoritiesMapper();
93
        return authoritiesMapper;
94
    }
95

    
96
    @Bean
97
    public StaticServerConfigurationService staticServerConfigurationService() {
98
        StaticServerConfigurationService staticServerConfigurationService = new StaticServerConfigurationService();
99
        Map<String, ServerConfiguration> servers = new HashMap<>();
100
        servers.put(oidcIssuer, serverConfiguration());
101
        staticServerConfigurationService.setServers(servers);
102
        return staticServerConfigurationService;
103
    }
104

    
105
    @Bean
106
    public StaticClientConfigurationService staticClientConfigurationService() {
107
        StaticClientConfigurationService staticClientConfigurationService = new StaticClientConfigurationService();
108
        Map<String, RegisteredClient> clients = new HashMap<>();
109
        clients.put(oidcIssuer, registeredClient());
110
        staticClientConfigurationService.setClients(clients);
111
        return staticClientConfigurationService;
112
    }
113

    
114
    @Bean
115
    public RegisteredClient registeredClient() {
116
        RegisteredClient registeredClient = new RegisteredClient();
117
        registeredClient.setClientId(oidcId);
118
        registeredClient.setClientSecret(oidcSecret);
119
        registeredClient.setScope(new HashSet<>(Arrays.asList("openid", "eduperson_entitlement", "profile", "email")));
120
        registeredClient.setTokenEndpointAuthMethod(AuthMethod.SECRET_BASIC);
121
        registeredClient.setRedirectUris(new HashSet<>(Collections.singletonList(oidcDevHome)));
122
        return registeredClient;
123
    }
124

    
125
    @Bean
126
    public StaticAuthRequestOptionsService staticAuthRequestOptionsService() {
127
        return new StaticAuthRequestOptionsService();
128
    }
129

    
130
    @Bean
131
    public PlainAuthRequestUrlBuilder plainAuthRequestUrlBuilder() {
132
        return new PlainAuthRequestUrlBuilder();
133
    }
134

    
135
    @Bean
136
    public ServerConfiguration serverConfiguration() {
137
        ServerConfiguration serverConfiguration = new ServerConfiguration();
138
        serverConfiguration.setIssuer(oidcIssuer);
139
        serverConfiguration.setAuthorizationEndpointUri(oidcIssuer + "authorize");
140
        serverConfiguration.setTokenEndpointUri(oidcIssuer + "token");
141
        serverConfiguration.setUserInfoUri(oidcIssuer + "userinfo");
142
        serverConfiguration.setJwksUri(oidcIssuer + "jwk");
143
        serverConfiguration.setRevocationEndpointUri(oidcIssuer + "revoke");
144
        return serverConfiguration;
145
    }
146

    
147
    @Bean
148
    public LoginUrlAuthenticationEntryPoint authenticationEntryPoint() {
149
        return new LoginUrlAuthenticationEntryPoint("/openid_connect_login");
150
    }
151

    
152

    
153
    @Bean
154
    public OIDCAuthenticationFilter openIdConnectAuthenticationFilter() throws Exception {
155
        OIDCAuthenticationFilter oidc = new OIDCAuthenticationFilter();
156
        oidc.setAuthenticationManager(authenticationManagerBean());
157
        oidc.setIssuerService(staticSingleIssuerService());
158
        oidc.setServerConfigurationService(staticServerConfigurationService());
159
        oidc.setClientConfigurationService(staticClientConfigurationService());
160
        oidc.setAuthRequestOptionsService(staticAuthRequestOptionsService());
161
        oidc.setAuthRequestUrlBuilder(plainAuthRequestUrlBuilder());
162
        oidc.setAuthenticationSuccessHandler(frontEndRedirect());
163
        return oidc;
164
    }
165

    
166
    @Bean
167
    public StaticSingleIssuerService staticSingleIssuerService() {
168
        StaticSingleIssuerService staticSingleIssuerService = new StaticSingleIssuerService();
169
        staticSingleIssuerService.setIssuer(oidcIssuer);
170
        return staticSingleIssuerService;
171
    }
172

    
173
    @Bean(initMethod = "init")
174
    public FrontEndLinkURIAuthenticationSuccessHandler frontEndRedirect() {
175
        FrontEndLinkURIAuthenticationSuccessHandler frontEnd = new FrontEndLinkURIAuthenticationSuccessHandler();
176
        frontEnd.setFrontEndURI(webAppFrontEnd);
177
        return frontEnd;
178
    }
179

    
180
}
(1-1/12)