1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.security.token;
19
20 import static org.apache.hadoop.hdfs.protocol.HdfsConstants.HDFS_URI_SCHEME;
21 import static org.apache.hadoop.hdfs.security.token.delegation.DelegationTokenIdentifier.HDFS_DELEGATION_KIND;
22 import static org.apache.hadoop.hdfs.web.WebHdfsConstants.SWEBHDFS_SCHEME;
23 import static org.apache.hadoop.hdfs.web.WebHdfsConstants.SWEBHDFS_TOKEN_KIND;
24 import static org.apache.hadoop.hdfs.web.WebHdfsConstants.WEBHDFS_SCHEME;
25 import static org.apache.hadoop.hdfs.web.WebHdfsConstants.WEBHDFS_TOKEN_KIND;
26
27 import java.io.IOException;
28 import java.util.Objects;
29
30 import org.apache.commons.logging.Log;
31 import org.apache.commons.logging.LogFactory;
32 import org.apache.hadoop.fs.FileSystem;
33 import org.apache.hadoop.hbase.classification.InterfaceAudience;
34 import org.apache.hadoop.hbase.classification.InterfaceStability;
35 import org.apache.hadoop.hbase.security.UserProvider;
36 import org.apache.hadoop.security.token.Token;
37
38
39
40
41
42
43 @InterfaceAudience.Private
44 @InterfaceStability.Evolving
45 public class FsDelegationToken {
46 private static final Log LOG = LogFactory.getLog(FsDelegationToken.class);
47
48 private final UserProvider userProvider;
49 private final String renewer;
50
51 private boolean hasForwardedToken = false;
52 private Token<?> userToken = null;
53 private FileSystem fs = null;
54
55
56
57
58 public FsDelegationToken(final UserProvider userProvider, final String renewer) {
59 this.userProvider = userProvider;
60 this.renewer = renewer;
61 }
62
63
64
65
66
67
68
69
70
71 public void acquireDelegationToken(final FileSystem fs)
72 throws IOException {
73 String tokenKind;
74 String scheme = fs.getUri().getScheme();
75 if (SWEBHDFS_SCHEME.equalsIgnoreCase(scheme)) {
76 tokenKind = SWEBHDFS_TOKEN_KIND.toString();
77 } else if (WEBHDFS_SCHEME.equalsIgnoreCase(scheme)) {
78 tokenKind = WEBHDFS_TOKEN_KIND.toString();
79 } else if (HDFS_URI_SCHEME.equalsIgnoreCase(scheme)) {
80 tokenKind = HDFS_DELEGATION_KIND.toString();
81 } else {
82 LOG.warn("Unknown FS URI scheme: " + scheme);
83
84 tokenKind = HDFS_DELEGATION_KIND.toString();
85 }
86
87 acquireDelegationToken(tokenKind, fs);
88 }
89
90
91
92
93
94
95
96
97
98 public void acquireDelegationToken(final String tokenKind, final FileSystem fs)
99 throws IOException {
100 Objects.requireNonNull(tokenKind, "tokenKind:null");
101 if (userProvider.isHadoopSecurityEnabled()) {
102 this.fs = fs;
103 userToken = userProvider.getCurrent().getToken(tokenKind, fs.getCanonicalServiceName());
104 if (userToken == null) {
105 hasForwardedToken = false;
106 try {
107 userToken = fs.getDelegationToken(renewer);
108 } catch (NullPointerException npe) {
109
110 LOG.error("Failed to get token for " + renewer);
111 }
112 } else {
113 hasForwardedToken = true;
114 LOG.info("Use the existing token: " + userToken);
115 }
116 }
117 }
118
119
120
121
122 public void releaseDelegationToken() {
123 if (userProvider.isHadoopSecurityEnabled()) {
124 if (userToken != null && !hasForwardedToken) {
125 try {
126 userToken.cancel(this.fs.getConf());
127 } catch (Exception e) {
128 LOG.warn("Failed to cancel HDFS delegation token: " + userToken, e);
129 }
130 }
131 this.userToken = null;
132 this.fs = null;
133 }
134 }
135
136 public UserProvider getUserProvider() {
137 return userProvider;
138 }
139
140
141
142
143 public String getRenewer() {
144 return renewer;
145 }
146
147
148
149
150 public Token<?> getUserToken() {
151 return userToken;
152 }
153
154 public FileSystem getFileSystem() {
155 return fs;
156 }
157 }