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.configuration.EnableWebSecurity;
16
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
17
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
18
import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;
19

    
20
import java.util.Collections;
21
import java.util.HashMap;
22
import java.util.HashSet;
23
import java.util.Map;
24

    
25
@Configuration
26
@EnableWebSecurity
27
public class AaiSecurityConfiguration extends WebSecurityConfigurerAdapter {
28

    
29
    @Value("${webapp.dev.front}")
30
    private String logoutSuccessUrl;
31

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

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

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

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

    
44
    @Value("${webapp.dev.front}")
45
    private String webAppFrontEnd;
46

    
47
    private Map<String, String> userRoles = new HashMap<String, String>(){{
48
        put("urn:geant:openaire.eu:group:Super+Administrator#aai.openaire.eu", "ROLE_ADMIN");
49
        put("urn:geant:openaire.eu:group:Content+Provider+Dashboard+Administrator#aai.openaire.eu","ROLE_PROVIDE_ADMIN");
50
    }};
51

    
52
    @Bean
53
    @Override
54
    public AuthenticationManager authenticationManagerBean() throws Exception {
55
        return authenticationManager();
56
    }
57

    
58
    @Override
59
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
60
        auth.authenticationProvider(openIdConnectAuthenticationProvider());
61
    }
62

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

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

    
89
    @Bean
90
    public OpenAireProviderAuthoritiesMapper authoritiesMapper(){
91
        OpenAireProviderAuthoritiesMapper authoritiesMapper = new OpenAireProviderAuthoritiesMapper(userRoles);
92
        return authoritiesMapper;
93
    }
94

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

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

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

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

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

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

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

    
151

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

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

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

    
179
}
(1-1/10)