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

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

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

    
61
    @Override
62
    public void configure(WebSecurity web) throws Exception {
63
        web.ignoring().antMatchers("/stats/**");
64
    }
65

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

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

    
92
    @Bean
93
    public OpenAireProviderAuthoritiesMapper authoritiesMapper(){
94
        OpenAireProviderAuthoritiesMapper authoritiesMapper = new OpenAireProviderAuthoritiesMapper(userRoles);
95
        return authoritiesMapper;
96
    }
97

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

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

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

    
127
    @Bean
128
    public StaticAuthRequestOptionsService staticAuthRequestOptionsService(){
129
        return new StaticAuthRequestOptionsService();
130
    }
131

    
132
    @Bean
133
    public PlainAuthRequestUrlBuilder plainAuthRequestUrlBuilder(){
134
        return new PlainAuthRequestUrlBuilder();
135
    }
136

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

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

    
154

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

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

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

    
182
}
(1-1/10)