Refine access control, peer access
[federation.git] / gateway / src / main / java / org / acumos / federation / gateway / security / X509AuthenticationFilter.java
1 /*-
2  * ===============LICENSE_START=======================================================
3  * Acumos
4  * ===================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property & Tech Mahindra. All rights reserved.
6  * ===================================================================================
7  * This Acumos software file is distributed by AT&T and Tech Mahindra
8  * under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *  
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *  
14  * This file is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ===============LICENSE_END=========================================================
19  */
20
21 package org.acumos.federation.gateway.security;
22
23 import java.util.List;
24
25 import org.acumos.cds.domain.MLPPeer;
26
27 import org.acumos.federation.gateway.config.EELFLoggerDelegate;
28 import org.acumos.federation.gateway.service.PeerService;
29 import org.acumos.federation.gateway.util.Utils;
30
31 import org.springframework.beans.factory.annotation.Autowired;
32 import org.springframework.beans.factory.annotation.Value;
33 import org.springframework.context.annotation.Bean;
34 import org.springframework.context.annotation.Configuration;
35
36 import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
37 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
38 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
39 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
40 import org.springframework.security.core.authority.AuthorityUtils;
41 import org.springframework.security.core.userdetails.User;
42 import org.springframework.security.core.userdetails.UserDetails;
43 import org.springframework.security.core.userdetails.UserDetailsService;
44
45 /**
46  * 
47  * X.509 certificate authentication :  verifying the identity of a communication peer when using the HTTPS (HTTP over SSL) protocol.
48  *
49  */
50
51 @Configuration
52 @EnableWebSecurity
53 @EnableGlobalMethodSecurity(prePostEnabled = true)
54 public class X509AuthenticationFilter extends WebSecurityConfigurerAdapter {
55         
56         private final EELFLoggerDelegate log = EELFLoggerDelegate.getLogger(getClass().getName());
57
58         @Autowired
59         private PeerService peerService;
60
61         @Value("${federation.enablePeerAuthentication:true}")
62         private boolean securityEnabled;
63
64         public X509AuthenticationFilter() {
65         }
66
67 /*
68         public X509AuthenticationFilter(boolean disableDefaults) {
69                 super(disableDefaults);
70         }
71 */
72         /**
73      * subjectPrincipalRegex("CN=(.*?)(?:,|$)") :- The regular expression used to extract a username from the client certificates subject name.
74      * (CN value of the client certificate)
75      */
76         @Override
77         protected void configure(HttpSecurity http) throws Exception {
78
79                 http
80                 .authorizeRequests()
81                         .anyRequest().authenticated()
82                 .and()
83                         .x509()
84                                 .subjectPrincipalRegex("CN=(.*?)(?:,|$)")
85                                 .userDetailsService(userDetailsService());
86
87         }
88         
89         //@Bean
90         public UserDetailsService userDetailsService() {
91                 return (username -> {
92                         log.info(EELFLoggerDelegate.debugLogger, " X509 subject : " + username);
93                         List<MLPPeer> mlpPeers = peerService.getPeer(username);
94                         log.info(EELFLoggerDelegate.debugLogger, " Peers matching X509 subject : " + mlpPeers);
95       if(!Utils.isEmptyList(mlpPeers)) {
96                                 log.info(EELFLoggerDelegate.debugLogger, " We are providing a matching Use ");
97                                 return new Peer(username, Role.PEER.priviledges());
98                         }
99                         else    {
100                                 return new Peer(username, Role.ANY.priviledges());
101                                 //return null;
102                         }
103                 });
104         }
105 }
106