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("${webapp.dev.front}")
28
    private String logoutSuccessUrl;
29

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

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

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

    
39
    @Value("${oidc.dev.home}")
40
    private String oidcDevHome;
41

    
42
    @Value("${webapp.dev.front}")
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.csrf().disable()
64
                .anonymous().disable()
65
                .authorizeRequests()
66
                .anyRequest().authenticated()
67
                .and()
68
                .httpBasic()
69
                .authenticationEntryPoint(authenticationEntryPoint())
70
                .and()
71
                .logout().logoutUrl("/openid_logout")
72
                .invalidateHttpSession(true)
73
                .deleteCookies("openAIRESession")
74
                .logoutSuccessUrl(logoutSuccessUrl)
75
                .and()
76
                .addFilterBefore(openIdConnectAuthenticationFilter(), AbstractPreAuthenticatedProcessingFilter.class)
77
        ;
78
    }
79

    
80
    @Bean
81
    public OIDCAuthenticationProvider openIdConnectAuthenticationProvider() {
82
        OIDCAuthenticationProvider oidcProvider = new OIDCAuthenticationProvider();
83
        oidcProvider.setAuthoritiesMapper(authoritiesMapper());
84
        return oidcProvider;
85
    }
86

    
87
    @Bean
88
    public OpenAIREAuthoritiesMapper authoritiesMapper() {
89
        OpenAIREAuthoritiesMapper authoritiesMapper = new OpenAIREAuthoritiesMapper();
90
        return authoritiesMapper;
91
    }
92

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

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

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

    
122
    @Bean
123
    public StaticAuthRequestOptionsService staticAuthRequestOptionsService() {
124
        return new StaticAuthRequestOptionsService();
125
    }
126

    
127
    @Bean
128
    public PlainAuthRequestUrlBuilder plainAuthRequestUrlBuilder() {
129
        return new PlainAuthRequestUrlBuilder();
130
    }
131

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

    
144
    @Bean
145
    public LoginUrlAuthenticationEntryPoint authenticationEntryPoint() {
146
        return new LoginUrlAuthenticationEntryPoint("/openid_connect_login");
147
    }
148

    
149

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

    
163
    @Bean
164
    public StaticSingleIssuerService staticSingleIssuerService() {
165
        StaticSingleIssuerService staticSingleIssuerService = new StaticSingleIssuerService();
166
        staticSingleIssuerService.setIssuer(oidcIssuer);
167
        return staticSingleIssuerService;
168
    }
169

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

    
177
}
(1-1/10)