Project

General

Profile

« Previous | Next » 

Revision 59336

Spring security library providing preauthorize and authenticated methods for apis

View differences:

modules/uoa-authorization-library/trunk/src/main/java/eu/dnetlib/uoaauthorizationlibrary/utils/AuthorizationUtils.java
1
package eu.dnetlib.uoaauthorizationlibrary.utils;
2

  
3
import com.google.gson.Gson;
4
import eu.dnetlib.uoaauthorizationlibrary.configuration.SecurityConfig;
5
import org.apache.log4j.Logger;
6
import org.springframework.beans.factory.annotation.Autowired;
7
import org.springframework.stereotype.Component;
8

  
9
import javax.servlet.http.Cookie;
10
import javax.servlet.http.HttpServletRequest;
11
import java.io.BufferedReader;
12
import java.io.InputStreamReader;
13
import java.io.StringReader;
14
import java.net.HttpURLConnection;
15
import java.net.URL;
16

  
17
@Component
18
public class AuthorizationUtils {
19
    private final Logger log = Logger.getLogger(this.getClass());
20
    private SecurityConfig securityConfig;
21

  
22
    @Autowired
23
    AuthorizationUtils(SecurityConfig securityConfig) {
24
        this.securityConfig = securityConfig;
25
    }
26

  
27
    public String getToken(HttpServletRequest request) {
28
        return this.getCookie(request, "AccessToken");
29
    }
30

  
31
    public boolean checkCookies(HttpServletRequest request) {
32
        boolean valid = true;
33
        String cookieValue = this.getCookie(request, "AccessToken");
34
        if (cookieValue == null || cookieValue.isEmpty()) {
35
            log.info("no cookie available ");
36
            valid = false;
37
        }
38
        return valid;
39
    }
40

  
41
    private String getCookie(HttpServletRequest request, String cookieName) {
42
        if (request.getCookies() == null) {
43
            return null;
44
        }
45
        for (Cookie c : request.getCookies()) {
46
            if (c.getName().equals(cookieName)) {
47
                return c.getValue();
48
            }
49

  
50
        }
51
        return null;
52
    }
53

  
54
    public UserInfo getUserInfo(String accessToken) {
55
        String url = securityConfig.getUserInfoUrl() + accessToken;
56
        try {
57
            URL obj = new URL(url);
58
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
59
            if (con.getResponseCode() != 200) {
60
                log.debug("User info response code is: " + con.getResponseCode());
61
                return null;
62
            }
63
            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
64
            StringBuilder response = new StringBuilder();
65
            String inputLine;
66
            while ((inputLine = in.readLine()) != null) {
67
                response.append(inputLine).append("\n");
68
            }
69
            in.close();
70
            return json2UserInfo(response.toString());
71
        } catch (Exception e) {
72
            log.error("An error occured while trying to fetch user info ", e);
73
            return null;
74
        }
75
    }
76

  
77
    private UserInfo json2UserInfo(String json) {
78
        if (json == null) {
79
            return null;
80
        }
81
        BufferedReader br = new BufferedReader(new StringReader(json));
82
        //convert the json string back to object
83
        Gson gson = new Gson();
84
        UserInfo userInfo = null;
85
        try {
86
            userInfo = gson.fromJson(br, UserInfo.class);
87
        } catch (Exception e) {
88
            log.debug("Error in parsing json response. Given json is : " + json, e);
89
            return null;
90
        }
91
        try {
92
            if (userInfo != null && userInfo.getEdu_person_entitlements() != null) {
93
                for (int i = 0; i < userInfo.getEdu_person_entitlements().size(); i++) {
94
                    String role = userInfo.getEdu_person_entitlements().get(i);
95
                    role = role.split(":")[role.split(":").length - 1];
96
                    role = role.replace("+", " ");
97
                    userInfo.getEdu_person_entitlements().set(i, role);
98
                }
99
            }
100
        } catch (Exception e) {
101
            log.debug("Error in parsing  Edu_person_entitlements : ", e);
102
            return null;
103
        }
104
        return userInfo;
105
    }
106

  
107
    public boolean isAuthorized(String token) {
108
        UserInfo userInfo = getUserInfo(token);
109
        if (userInfo != null) {
110
            return true;
111
        } else {
112
            log.debug(" User has no Valid UserInfo");
113
            return false;
114
        }
115

  
116
    }
117
}
modules/uoa-authorization-library/trunk/src/main/java/eu/dnetlib/uoaauthorizationlibrary/utils/UserInfo.java
1
package eu.dnetlib.uoaauthorizationlibrary.utils;
2

  
3
import java.util.ArrayList;
4
import java.util.List;
5

  
6
public class UserInfo {
7
    String name;
8
    String email;
9
    List<String> edu_person_entitlements = new ArrayList<String>();
10
    List<String> roles = new ArrayList<>();
11

  
12
    @Override
13
    public String toString() {
14
        return "UserInfo{" +
15
                "name='" + name + '\'' +
16
                ", email='" + email + '\'' +
17
                ", edu_person_entitlements=" + edu_person_entitlements +
18
                ", roles=" + roles +
19
                '}';
20
    }
21

  
22
    public String getName() {
23
        return name;
24
    }
25

  
26
    public void setName(String name) {
27
        this.name = name;
28
    }
29

  
30
    public String getEmail() {
31
        return email;
32
    }
33

  
34
    public void setEmail(String email) {
35
        this.email = email;
36
    }
37

  
38
    public List<String> getEdu_person_entitlements() {
39
        return edu_person_entitlements;
40
    }
41

  
42
    public void setEdu_person_entitlements(List<String> edu_person_entitlements) {
43
        this.edu_person_entitlements = edu_person_entitlements;
44
    }
45

  
46
    public List<String> getRoles() {
47
        return roles;
48
    }
49

  
50
    public void setRoles(List<String> roles) {
51
        this.roles = roles;
52
    }
53
}
modules/uoa-authorization-library/trunk/src/main/java/eu/dnetlib/uoaauthorizationlibrary/configuration/AuthorizationConfiguration.java
1
package eu.dnetlib.uoaauthorizationlibrary.configuration;
2

  
3
import org.springframework.boot.context.properties.EnableConfigurationProperties;
4
import org.springframework.context.annotation.*;
5

  
6
@Configuration
7
@PropertySources({
8
        @PropertySource("classpath:authorization.properties"),
9
        @PropertySource(value = "classpath:dnet-override.properties", ignoreResourceNotFound = true)
10
})
11
@EnableConfigurationProperties({SecurityConfig.class})
12
@ComponentScan(basePackages = { "eu.dnetlib.uoaauthorizationlibrary" })
13
public class AuthorizationConfiguration { }
modules/uoa-authorization-library/trunk/src/main/java/eu/dnetlib/uoaauthorizationlibrary/configuration/SecurityConfig.java
1
package eu.dnetlib.uoaauthorizationlibrary.configuration;
2

  
3
import org.springframework.boot.context.properties.ConfigurationProperties;
4

  
5
@ConfigurationProperties("authorization.security")
6
public class SecurityConfig {
7

  
8
    private String userInfoUrl;
9
    private String originServer;
10

  
11
    public String getUserInfoUrl() {
12
        return userInfoUrl;
13
    }
14

  
15
    public void setUserInfoUrl(String userInfoUrl) {
16
        this.userInfoUrl = userInfoUrl;
17
    }
18

  
19
    public String getOriginServer() {
20
        return originServer;
21
    }
22

  
23
    public void setOriginServer(String originServer) {
24
        this.originServer = originServer;
25
    }
26

  
27
}
modules/uoa-authorization-library/trunk/src/main/java/eu/dnetlib/uoaauthorizationlibrary/security/AuthorizationService.java
1
package eu.dnetlib.uoaauthorizationlibrary.security;
2

  
3
import org.springframework.stereotype.Component;
4

  
5
@Component(value = "AuthorizationService")
6
public class AuthorizationService {
7

  
8
    public final String SUPER_ADMIN = "SUPER_ADMINISTRATOR";
9
    public final String PORTAL_ADMIN = "PORTAL_ADMINISTRATOR";
10
    public final String USER_ADMIN = "USER_MANAGER";
11

  
12
    /**
13
     * Type = FUNDER | COMMUNITY | INSTITUTION | PROJECT
14
     *
15
     * */
16
    public String curator(String type) {
17
        return type.toUpperCase() + "_CURATOR";
18
    }
19

  
20
    /**
21
     * Type = FUNDER | COMMUNITY | INSTITUTION | PROJECT
22
     *
23
     * Id = EE, EGI, etc
24
     * */
25
    public String manager(String type, String id) {
26
        return type.toUpperCase() + "_" + id.toUpperCase() + "_MANAGER";
27
    }
28

  
29
    /**
30
     * Type = FUNDER | COMMUNITY | INSTITUTION | PROJECT
31
     *
32
     * Id = EE, EGI, etc
33
     * */
34
    public String subscriber(String type, String id) {
35
        return type.toUpperCase() + "_" + id.toUpperCase();
36
    }
37
}
modules/uoa-authorization-library/trunk/src/main/java/eu/dnetlib/uoaauthorizationlibrary/security/AuthorizationFilter.java
1
package eu.dnetlib.uoaauthorizationlibrary.security;
2

  
3
import eu.dnetlib.uoaauthorizationlibrary.utils.AuthorizationUtils;
4
import org.apache.log4j.Logger;
5
import org.springframework.beans.factory.annotation.Autowired;
6
import org.springframework.http.HttpStatus;
7
import org.springframework.security.core.Authentication;
8
import org.springframework.security.core.context.SecurityContextHolder;
9
import org.springframework.stereotype.Component;
10
import org.springframework.web.filter.GenericFilterBean;
11

  
12
import javax.servlet.*;
13
import javax.servlet.http.HttpServletRequest;
14
import javax.servlet.http.HttpServletResponse;
15
import java.io.IOException;
16

  
17
@Component
18
public class AuthorizationFilter implements Filter {
19

  
20
    private AuthorizationProvider authorizationProvider;
21
    private AuthorizationUtils utils;
22
    private final Logger log = Logger.getLogger(this.getClass());
23

  
24
    @Autowired
25
    AuthorizationFilter(AuthorizationProvider authorizationProvider, AuthorizationUtils utils) {
26
        this.authorizationProvider = authorizationProvider;
27
        this.utils = utils;
28
    }
29

  
30
    @Override
31
    public void init(FilterConfig filterConfig) throws ServletException {
32

  
33
    }
34

  
35
    @Override
36
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {
37
        HttpServletRequest request = (HttpServletRequest) req;
38
        String token = utils.getToken(request);
39
        if (token != null) {
40
            Authentication auth = authorizationProvider.getAuthentication(token);
41
            SecurityContextHolder.getContext().setAuthentication(auth);
42
        } else {
43
            HttpServletResponse response = (HttpServletResponse) res;
44
            response.sendError(HttpStatus.UNAUTHORIZED.value(), "No token has been found");
45
            return;
46
        }
47
        filterChain.doFilter(req, res);
48
    }
49

  
50
    @Override
51
    public void destroy() {
52

  
53
    }
54
}
modules/uoa-authorization-library/trunk/src/main/java/eu/dnetlib/uoaauthorizationlibrary/security/UserDetailsServiceImpl.java
1
package eu.dnetlib.uoaauthorizationlibrary.security;
2

  
3
import eu.dnetlib.uoaauthorizationlibrary.utils.AuthorizationUtils;
4
import eu.dnetlib.uoaauthorizationlibrary.utils.UserInfo;
5
import org.springframework.beans.factory.annotation.Autowired;
6
import org.springframework.security.core.GrantedAuthority;
7
import org.springframework.security.core.authority.SimpleGrantedAuthority;
8
import org.springframework.security.core.userdetails.UserDetails;
9
import org.springframework.security.core.userdetails.UserDetailsService;
10
import org.springframework.security.core.userdetails.UsernameNotFoundException;
11
import org.springframework.stereotype.Service;
12

  
13
import java.util.ArrayList;
14
import java.util.List;
15

  
16
@Service
17
public class UserDetailsServiceImpl implements UserDetailsService {
18

  
19
    private AuthorizationUtils utils;
20

  
21
    @Autowired
22
    public UserDetailsServiceImpl(AuthorizationUtils utils) {
23
        this.utils = utils;
24
    }
25

  
26
    private List<GrantedAuthority> getAuthorities(List<String> roles) {
27
        List<GrantedAuthority> authorities = new ArrayList<>();
28
        for(String role : roles) {
29
            authorities.add(new SimpleGrantedAuthority(role));
30
        }
31
        return authorities;
32
    }
33

  
34
    @Override
35
    public UserDetails loadUserByUsername(String token) throws UsernameNotFoundException {
36
        final UserInfo user = utils.getUserInfo(token);
37

  
38
        if (user == null) {
39
            throw new UsernameNotFoundException("invalid token: " + token);
40
        }
41

  
42
        return org.springframework.security.core.userdetails.User
43
                .withUsername(user.getEmail()).password("")
44
                .authorities(getAuthorities(user.getRoles()))
45
                .accountExpired(false)
46
                .accountLocked(false)
47
                .credentialsExpired(false)
48
                .disabled(false)
49
                .build();
50
    }
51

  
52
}
modules/uoa-authorization-library/trunk/src/main/java/eu/dnetlib/uoaauthorizationlibrary/security/AuthorizationFilterConfigurer.java
1
package eu.dnetlib.uoaauthorizationlibrary.security;
2

  
3
import eu.dnetlib.uoaauthorizationlibrary.utils.AuthorizationUtils;
4
import org.springframework.beans.factory.annotation.Autowired;
5
import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
6
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
7
import org.springframework.security.web.DefaultSecurityFilterChain;
8
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
9
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
10

  
11
public class AuthorizationFilterConfigurer extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {
12

  
13
    private AuthorizationProvider authorizationProvider;
14
    private AuthorizationUtils utils;
15

  
16
    @Override
17
    public void init(HttpSecurity http) throws Exception {
18
        http.csrf().disable();
19
    }
20

  
21
    @Autowired
22
    public AuthorizationFilterConfigurer(AuthorizationProvider authorizationProvider, AuthorizationUtils utils) {
23
        this.authorizationProvider = authorizationProvider;
24
        this.utils = utils;
25
    }
26

  
27
    @Override
28
    public void configure(HttpSecurity http) throws Exception {
29
        AuthorizationFilter customFilter = new AuthorizationFilter(authorizationProvider, utils);
30
        http.addFilterBefore(customFilter, BasicAuthenticationFilter.class);
31
    }
32

  
33
}
modules/uoa-authorization-library/trunk/src/main/java/eu/dnetlib/uoaauthorizationlibrary/security/AuthorizationProvider.java
1
package eu.dnetlib.uoaauthorizationlibrary.security;
2

  
3
import org.springframework.beans.factory.annotation.Autowired;
4
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
5
import org.springframework.security.core.Authentication;
6
import org.springframework.security.core.userdetails.UserDetails;
7
import org.springframework.stereotype.Component;
8

  
9
@Component
10
public class AuthorizationProvider {
11

  
12
    private UserDetailsServiceImpl userDetailsService;
13

  
14
    @Autowired
15
    AuthorizationProvider(UserDetailsServiceImpl userDetailsService) {
16
        this.userDetailsService = userDetailsService;
17
    }
18

  
19
    public Authentication getAuthentication(String token) {
20
        UserDetails userDetails = userDetailsService.loadUserByUsername(token);
21
        return new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities());
22
    }
23
}
modules/uoa-authorization-library/trunk/src/main/java/eu/dnetlib/uoaauthorizationlibrary/security/WebSecurityConfig.java
1
package eu.dnetlib.uoaauthorizationlibrary.security;
2

  
3
import eu.dnetlib.uoaauthorizationlibrary.utils.AuthorizationUtils;
4
import org.springframework.beans.factory.annotation.Autowired;
5
import org.springframework.context.annotation.ComponentScan;
6
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
7
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
8
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
9
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
10
import org.springframework.security.config.http.SessionCreationPolicy;
11

  
12
@EnableGlobalMethodSecurity(securedEnabled = true)
13
@EnableWebSecurity
14
@ComponentScan(basePackages = {"eu.dnetlib.uoaauthorizationlibrary.*"})
15
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
16

  
17
    private AuthorizationProvider authorizationProvider;
18
    private AuthorizationUtils utils;
19

  
20
    @Autowired
21
    WebSecurityConfig(AuthorizationProvider authorizationProvider, AuthorizationUtils utils) {
22
        this.authorizationProvider = authorizationProvider;
23
        this.utils = utils;
24
    }
25

  
26
    @Override
27
    protected void configure(HttpSecurity http) throws Exception {
28
        http.apply(new AuthorizationFilterConfigurer(authorizationProvider, utils));
29
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
30
        http.authorizeRequests().anyRequest().authenticated();
31
        http.httpBasic();
32
    }
33

  
34
}
modules/uoa-authorization-library/trunk/src/main/java/eu/dnetlib/uoaauthorizationlibrary/security/CorsConfig.java
1
package eu.dnetlib.uoaauthorizationlibrary.security;
2

  
3
import eu.dnetlib.uoaauthorizationlibrary.configuration.SecurityConfig;
4
import org.springframework.beans.factory.annotation.Autowired;
5
import org.springframework.context.annotation.Configuration;
6
import org.springframework.web.servlet.config.annotation.CorsRegistry;
7
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
8

  
9
@Configuration
10
public class CorsConfig extends WebMvcConfigurerAdapter {
11

  
12
    SecurityConfig securityConfig;
13

  
14
    @Autowired
15
    CorsConfig(SecurityConfig securityConfig) {
16
        this.securityConfig = securityConfig;
17
    }
18

  
19
    @Override
20
    public void addCorsMappings(CorsRegistry registry) {
21
        registry.addMapping("/**")
22
                .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS")
23
                .allowCredentials(true);
24
    }
25
}
modules/uoa-authorization-library/trunk/src/main/resources/log4j.properties
1
log4j.rootLogger = DEBUG, R
2

  
3
log4j.logger.eu.dnetlib = DEBUG
4
log4j.logger.org.springframework = DEBUG, S
5

  
6
log4j.additivity.org.springframework = false
7

  
8
log4j.appender.R=org.apache.log4j.RollingFileAppender
9
log4j.appender.R.File=/var/log/dnet/uoa-authorization-library/uoa-authorization-library.log
10
log4j.appender.R.MaxFileSize=10MB
11
log4j.appender.R.MaxBackupIndex=10
12
log4j.appender.R.layout=org.apache.log4j.PatternLayout
13
log4j.appender.R.layout.ConversionPattern= %d %p %t [%c] - %m%n
14

  
15
log4j.appender.S=org.apache.log4j.RollingFileAppender
16
log4j.appender.S.File=/var/log/dnet/uoa-authorization-library/uoa-authorization-library-spring.log
17
log4j.appender.S.MaxFileSize=10MB
18
log4j.appender.S.MaxBackupIndex=10
19
log4j.appender.S.layout=org.apache.log4j.PatternLayout
20
log4j.appender.S.layout.ConversionPattern= %d %p %t [%c] - %m%n
modules/uoa-authorization-library/trunk/src/main/resources/authorization.properties
1
#dev
2
authorization.security.userInfoUrl = http://mpagasas.di.uoa.gr:8080/dnet-openaire-users-1.0.0-SNAPSHOT/api/users/getUserInfo?accessToken=
3
authorization.security.originServer = *
4

  
5
#beta
6
#authorization.security.userInfoUrl =  https://beta.services.openaire.eu/uoa-user-management/api/users/getUserInfo?accessToken=
7
#authorization.security.originServer = .openaire.eu
8

  
9

  
10
#production
11
#authorization.security.userInfoUrl =  https://services.openaire.eu/uoa-user-management/api/users/getUserInfo?accessToken=
12
#authorization.security.originServer = .openaire.eu
modules/uoa-authorization-library/trunk/src/main/resources/application.properties
1
server.port=9090
modules/uoa-authorization-library/trunk/pom.xml
1
<?xml version="1.0" encoding="UTF-8"?>
2
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4
	<modelVersion>4.0.0</modelVersion>
5

  
6
	<groupId>eu.dnetlib</groupId>
7
	<artifactId>uoa-authorization-library</artifactId>
8
	<version>1.0.0-SNAPSHOT</version>
9
	<packaging>jar</packaging>
10

  
11
	<name>uoa-authorization-library</name>
12

  
13
	<parent>
14
		<groupId>org.springframework.boot</groupId>
15
		<artifactId>spring-boot-starter-parent</artifactId>
16
		<version>1.5.8.RELEASE</version>
17
		<relativePath/> <!-- lookup parent from repository -->
18
	</parent>
19

  
20
	<properties>
21
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
22
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
23
		<java.version>1.8</java.version>
24
	</properties>
25

  
26
	<dependencies>
27
		<dependency>
28
			<groupId>org.springframework.boot</groupId>
29
			<artifactId>spring-boot-starter-web</artifactId>
30
			<exclusions>
31
				<exclusion>
32
					<groupId> org.springframework.boot</groupId>
33
					<artifactId>spring-boot-starter-logging</artifactId>
34
				</exclusion>
35
			</exclusions>
36
		</dependency>
37
		<dependency>
38
			<groupId>org.springframework.boot</groupId>
39
			<artifactId>spring-boot-starter-tomcat</artifactId>
40
			<scope>provided</scope>
41
		</dependency>
42
		<dependency>
43
			<groupId>org.springframework.boot</groupId>
44
			<artifactId>spring-boot-starter-test</artifactId>
45
			<scope>test</scope>
46
		</dependency>
47
		<!-- Starter for using Spring Security -->
48
		<dependency>
49
			<groupId>org.springframework.boot</groupId>
50
			<artifactId>spring-boot-starter-security</artifactId>
51
		</dependency>
52
		<dependency>
53
			<groupId>com.google.code.gson</groupId>
54
			<artifactId>gson</artifactId>
55
			<version>2.8.2</version>
56
		</dependency>
57
		<dependency>
58
			<groupId>log4j</groupId>
59
			<artifactId>log4j</artifactId>
60
			<version>1.2.17</version>
61
		</dependency>
62
    </dependencies>
63
	<build>
64
		<plugins>
65
		</plugins>
66
        <finalName>uoa-authorization-library</finalName>
67
	</build>
68
</project>

Also available in: Unified diff