瀏覽代碼

增加ES用户认证功能

wangdong6 3 年之前
父節點
當前提交
7717d2ab78

+ 45 - 17
pom.xml

@ -58,29 +58,57 @@
58 58
            <version>1.18.12</version>
59 59
        </dependency>
60 60
61
<!--        <dependency>-->
62
<!--            <groupId>com.ai.abc</groupId>-->
63
<!--            <artifactId>persistence-es</artifactId>-->
64
<!--            <version>2.0-SNAPSHOT</version>-->
65
<!--            <exclusions>-->
66
<!--                <exclusion>-->
67
<!--                    <groupId>org.springframework.boot</groupId>-->
68
<!--                    <artifactId>spring-boot-starter-log4j2</artifactId>-->
69
<!--                </exclusion>-->
70
<!--            </exclusions>-->
71
<!--        </dependency>-->
72
73
61 74
        <dependency>
62
            <groupId>com.ai.abc</groupId>
63
            <artifactId>persistence-es</artifactId>
64
            <version>2.0-SNAPSHOT</version>
75
            <groupId>org.elasticsearch</groupId>
76
            <artifactId>elasticsearch</artifactId>
77
            <version>${elasticsearch.version}</version>
65 78
            <exclusions>
66 79
                <exclusion>
67
                    <groupId>org.springframework.boot</groupId>
68
                    <artifactId>spring-boot-starter-log4j2</artifactId>
80
                    <artifactId>snakeyaml</artifactId>
81
                    <groupId>org.yaml</groupId>
82
                </exclusion>
83
                <exclusion>
84
                    <artifactId>jopt-simple</artifactId>
85
                    <groupId>net.sf.jopt-simple</groupId>
86
                </exclusion>
87
                <exclusion>
88
                    <artifactId>jackson-core</artifactId>
89
                    <groupId>com.fasterxml.jackson.core</groupId>
69 90
                </exclusion>
70
<!--                <exclusion>-->
71
<!--                    <groupId>org.elasticsearch</groupId>-->
72
<!--                    <artifactId>elasticsearch</artifactId>-->
73
<!--                </exclusion>-->
74
<!--                <exclusion>-->
75
<!--                    <groupId>org.elasticsearch.client</groupId>-->
76
<!--                    <artifactId>elasticsearch-rest-high-level-client</artifactId>-->
77
<!--                </exclusion>-->
78
<!--                <exclusion>-->
79
<!--                    <groupId>org.projectlombok</groupId>-->
80
<!--                    <artifactId>lombok</artifactId>-->
81
<!--                </exclusion>-->
82 91
            </exclusions>
83 92
        </dependency>
93
94
        <dependency>
95
            <groupId>org.elasticsearch.client</groupId>
96
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
97
            <version>${elasticsearch.version}</version>
98
        </dependency>
99
100
        <dependency>
101
            <groupId>com.ai.abc</groupId>
102
            <artifactId>core</artifactId>
103
            <version>2.0-SNAPSHOT</version>
104
        </dependency>
105
106
        <dependency>
107
            <groupId>com.alibaba</groupId>
108
            <artifactId>fastjson</artifactId>
109
            <version>1.2.22</version>
110
        </dependency>
111
84 112
    </dependencies>
85 113
86 114
    <build>

+ 41 - 0
src/main/java/com/ai/abc/jpa/elastic/model/ElasticPage.java

@ -0,0 +1,41 @@
1
package com.ai.abc.jpa.elastic.model;
2
3
import com.ai.abc.core.model.AbstractModel;
4
import com.ai.abc.util.serializer.BusinessObjectsSerializer;
5
import com.alibaba.fastjson.JSONObject;
6
import lombok.Getter;
7
import lombok.NoArgsConstructor;
8
import lombok.Setter;
9
10
import java.io.Serializable;
11
import java.util.ArrayList;
12
import java.util.List;
13
14
/**
15
 * 描述
16
 *
17
 * @author
18
 * @createDate
19
 */
20
@NoArgsConstructor
21
@Getter
22
@Setter
23
public class ElasticPage <T extends Serializable> extends AbstractModel {
24
    private long totalSize;
25
26
    private int startNumber;
27
28
    private int pageSize;
29
30
    private List<JSONObject> results;
31
32
    public <T> List<T> getList(Class<T> clazz) {
33
        List<T> list = new ArrayList();
34
        for(JSONObject jsonObject : results) {
35
            T dtoTemp = BusinessObjectsSerializer.deserialize(jsonObject.toJSONString(), clazz);
36
            list.add(dtoTemp);
37
        }
38
39
        return list;
40
    }
41
}

+ 24 - 0
src/main/java/com/ai/abc/jpa/elastic/model/PageInfo.java

@ -0,0 +1,24 @@
1
package com.ai.abc.jpa.elastic.model;
2
3
import lombok.Getter;
4
import lombok.NoArgsConstructor;
5
import lombok.Setter;
6
7
/**
8
 * 描述
9
 *
10
 * @author
11
 * @createDate
12
 */
13
@NoArgsConstructor
14
@Getter
15
@Setter
16
public class PageInfo {
17
    private int startNumber;
18
19
    private int pageSize;
20
21
    private String sortName;
22
23
    private String direction;
24
}

+ 13 - 0
src/main/java/com/ai/abc/jpa/elastic/model/TimeInfo.java

@ -0,0 +1,13 @@
1
package com.ai.abc.jpa.elastic.model;
2
3
import lombok.Getter;
4
import lombok.Setter;
5
6
@Getter
7
@Setter
8
public class TimeInfo {
9
10
    private String fieldName;
11
    private String startTime;
12
    private String endTime;
13
}

+ 25 - 0
src/main/java/com/ai/abc/jpa/elastic/repository/ElasticEntityRepository.java

@ -0,0 +1,25 @@
1
package com.ai.abc.jpa.elastic.repository;
2
3
import com.ai.abc.jpa.elastic.model.ElasticPage;
4
import com.ai.abc.jpa.elastic.model.PageInfo;
5
import com.ai.abc.jpa.elastic.model.TimeInfo;
6
7
import java.io.Serializable;
8
import java.util.Date;
9
import java.util.Map;
10
11
public interface ElasticEntityRepository {
12
13
    void initServer(String esServer);
14
15
    void initServer(String esServer,String userName,String passWord);
16
17
    void purePersist(String tableName, String type, String entity);
18
19
    <T extends Serializable> ElasticPage<T> findEntity(String connectionName, Map<String, Object> hashMap, String startDate, String stopDate, PageInfo pageInfo);
20
21
    <T extends Serializable> ElasticPage<T> findEntity(Object entity, Date startDate, Date stopDate, PageInfo pageInfo);
22
23
24
    public abstract <T extends Serializable> ElasticPage<T> findEntity(String paramString, Map<String, Object> paramMap, TimeInfo paramTimeInfo, PageInfo paramPageInfo, Map<String, String> paramMap1);
25
}

+ 274 - 0
src/main/java/com/ai/abc/jpa/elastic/repository/impl/ElasticEntityRepositoryImpl.java

@ -0,0 +1,274 @@
1
package com.ai.abc.jpa.elastic.repository.impl;
2
3
import com.ai.abc.jpa.elastic.model.ElasticPage;
4
import com.ai.abc.jpa.elastic.model.PageInfo;
5
import com.ai.abc.jpa.elastic.model.TimeInfo;
6
import com.ai.abc.jpa.elastic.repository.ElasticEntityRepository;
7
import com.alibaba.fastjson.JSONObject;
8
import org.apache.commons.lang.StringUtils;
9
import org.apache.http.*;
10
import org.apache.http.message.BasicHeader;
11
import org.elasticsearch.action.index.IndexRequest;
12
import org.elasticsearch.action.index.IndexResponse;
13
import org.elasticsearch.action.search.SearchRequest;
14
import org.elasticsearch.action.search.SearchResponse;
15
import org.elasticsearch.action.search.SearchType;
16
import org.elasticsearch.client.RequestOptions;
17
import org.elasticsearch.client.RestClient;
18
import org.elasticsearch.client.RestClientBuilder;
19
import org.elasticsearch.client.RestHighLevelClient;
20
import org.elasticsearch.common.xcontent.XContentType;
21
import org.elasticsearch.index.query.BoolQueryBuilder;
22
import org.elasticsearch.index.query.QueryBuilders;
23
import org.elasticsearch.index.query.TermsQueryBuilder;
24
import org.elasticsearch.search.SearchHit;
25
import org.elasticsearch.search.builder.SearchSourceBuilder;
26
import org.elasticsearch.search.sort.SortBuilder;
27
import org.elasticsearch.search.sort.SortBuilders;
28
import org.elasticsearch.search.sort.SortOrder;
29
import org.slf4j.Logger;
30
import org.slf4j.LoggerFactory;
31
import org.springframework.stereotype.Component;
32
33
import java.io.IOException;
34
import java.io.Serializable;
35
import java.util.*;
36
37
/**
38
 * 描述
39
 *
40
 * @author
41
 * @createDate
42
 */
43
@Component
44
public class ElasticEntityRepositoryImpl implements ElasticEntityRepository {
45
    public final Logger log = LoggerFactory.getLogger(ElasticEntityRepositoryImpl.class);
46
47
    private String elasticSearchServer = "47.105.160.21:10020";
48
    private String userName = "";
49
    private String passWord = "";
50
51
    private RestHighLevelClient client = getProducer();
52
53
54
    @Override
55
    public void initServer(String esServer) {
56
        this.log.info("ElasticEntityRepositoryImpl esServer=" + esServer);
57
        this.elasticSearchServer = esServer;
58
        this.getProducer();
59
    }
60
61
    @Override
62
    public void initServer(String esServer,String userName,String passWord) {
63
        this.log.info("ElasticEntityRepositoryImpl esServer=" + esServer + " userName:" + userName + " passWord:"+passWord);
64
        this.elasticSearchServer = esServer;
65
        this.userName = userName;
66
        this.passWord = passWord;
67
        this.getProducer();
68
    }
69
70
71
//    public ElasticEntityRepositoryImpl(String esServer) {
72
//        log.debug("ElasticEntityRepositoryImpl esServer="+esServer);
73
//        elasticSearchServer = esServer;
74
//    }
75
76
//    public ElasticEntityRepositoryImpl(String esServer,String userName,String passWord) {
77
//        this.log.debug("ElasticEntityRepositoryImpl esServer=" + esServer + " userName:" + userName + " passWord:"+passWord);
78
//        this.elasticSearchServer = esServer;
79
//        this.userName = userName;
80
//        this.passWord = passWord;
81
//    }
82
83
    private RestHighLevelClient getProducer() {
84
        if (client == null) {
85
            String[] servers = elasticSearchServer.split(",");
86
            HttpHost[] httpHosts = new HttpHost[servers.length];
87
            for (int i = 0; i < servers.length; i++) {
88
                httpHosts[i] = HttpHost.create(servers[i]);
89
            }
90
            RestClientBuilder builder = RestClient.builder(httpHosts);
91
92
            Header[] headers = new Header[2];
93
            if(!StringUtils.isEmpty(userName) && !StringUtils.isEmpty(passWord)){
94
                headers[0] = new BasicHeader(HttpHeaders.AUTHORIZATION, userName+":"+passWord);
95
                headers[1] = new BasicHeader("Content-Type", "application/json");
96
                builder.setDefaultHeaders(headers);
97
            }
98
99
            client = new RestHighLevelClient(builder);
100
        }
101
102
        return client;
103
    }
104
105
    @Override
106
    public void purePersist(String index, String type, String messageBody) {
107
        IndexRequest request = new IndexRequest(index).source(messageBody, XContentType.JSON);
108
        try {
109
            IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
110
            log.debug(String.format("索引名称:%s; 更新内容:%s; 文档ID:%s; 状态:%s", indexResponse.getIndex(), messageBody,
111
                    indexResponse.getId(), indexResponse.status()));
112
        } catch (IOException e) {
113
            e.printStackTrace();
114
            //LOGGER.error(e.getMessage(), e);
115
        }
116
    }
117
118
    @Override
119
    public <T extends Serializable> ElasticPage<T> findEntity(String connectionName, Map<String, Object> hashMap, String startDate, String stopDate, PageInfo pageInfo) {
120
        SearchRequest searchRequest = new SearchRequest();
121
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
122
123
        // 处理查询条件
124
        List<TermsQueryBuilder> list = new ArrayList<>();
125
        if (hashMap !=null && !hashMap.isEmpty()) {
126
            for (Map.Entry<String, Object> entry : hashMap.entrySet()) {
127
                String mapKey = entry.getKey();
128
                if (entry.getValue() != null) {
129
                    String mapValue = entry.getValue().toString();
130
                    TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery(mapKey, mapValue);
131
                    list.add(termsQueryBuilder);
132
                }
133
            }
134
        }
135
136
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
137
        //处理开始结束时间
138
        if (StringUtils.isNotEmpty(startDate) && StringUtils.isNotEmpty(stopDate)) {
139
            boolQueryBuilder.must(QueryBuilders.rangeQuery("create_date").gte(startDate).lt(stopDate));
140
        } else if (StringUtils.isNotEmpty(startDate)) {
141
            boolQueryBuilder.must(QueryBuilders.rangeQuery("create_date").gte(startDate));
142
        } else if (StringUtils.isNotEmpty(stopDate)) {
143
            boolQueryBuilder.must(QueryBuilders.rangeQuery("create_date").lt(stopDate));
144
        }
145
146
        //处理其他条件
147
        for (TermsQueryBuilder termsAggregationBuilder : list) {
148
            boolQueryBuilder.must(termsAggregationBuilder);
149
        }
150
        sourceBuilder.query(boolQueryBuilder);
151
        if (pageInfo != null) {
152
            sourceBuilder.from(pageInfo.getStartNumber()).size(pageInfo.getPageSize());
153
        }
154
        searchRequest.indices(connectionName);
155
        searchRequest.source(sourceBuilder);
156
        searchRequest.searchType(SearchType.DFS_QUERY_THEN_FETCH);
157
158
        SearchResponse searchResponse = null;
159
        try {
160
            searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
161
        } catch (IOException e) {
162
            log.error("elastic client.search error"+e.getLocalizedMessage());
163
            e.printStackTrace();
164
        }
165
        log.debug("searchResponse="+searchResponse);
166
167
        //解析查询结果
168
        ElasticPage elasticPage = new ElasticPage();
169
        long totalSize = searchResponse.getHits().getTotalHits().value;
170
        Iterator<SearchHit> serarchHits = searchResponse.getHits().iterator();
171
        List<JSONObject> listResult = new ArrayList<>();
172
        while(serarchHits.hasNext()) {
173
            SearchHit searchHit = serarchHits.next();
174
            JSONObject jsonObject = JSONObject.parseObject(searchHit.getSourceAsString());
175
            listResult.add(jsonObject);
176
        }
177
        log.debug("listResult="+listResult);
178
179
        elasticPage.setTotalSize(totalSize);
180
        elasticPage.setResults(listResult);
181
182
        return elasticPage;
183
    }
184
185
    @Override
186
    public <T extends Serializable> ElasticPage<T> findEntity(Object entity, Date startDate, Date stopDate, PageInfo pageInfo) {
187
        return null;
188
    }
189
190
    public <T extends Serializable> ElasticPage<T> findEntity(String connectionName, Map<String, Object> hashMap, TimeInfo timeInfo, PageInfo pageInfo, Map<String, String> sortMap)
191
    {
192
        SearchRequest searchRequest = new SearchRequest();
193
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
194
195
        List<TermsQueryBuilder> list = new ArrayList();
196
        Iterator localIterator1;
197
        if ((hashMap != null) && (!(hashMap.isEmpty()))) {
198
            for (localIterator1 = hashMap.entrySet().iterator(); localIterator1.hasNext(); ) {
199
                Map.Entry entry = (Map.Entry)localIterator1.next();
200
                String mapKey = (String)entry.getKey();
201
                if (entry.getValue() != null) {
202
                    TermsQueryBuilder termsQueryBuilder = null;
203
                    if (entry.getValue().getClass() == ArrayList.class) {
204
                        this.log.debug("mapKey=" + mapKey + ",entry.getValue()=" + entry.getValue());
205
                        termsQueryBuilder = QueryBuilders.termsQuery(mapKey, (ArrayList)entry.getValue());
206
                    } else {
207
                        String mapValue = entry.getValue().toString();
208
                        termsQueryBuilder = QueryBuilders.termsQuery(mapKey, new String[] { mapValue });
209
                    }
210
                    list.add(termsQueryBuilder);
211
                }
212
            }
213
        }
214
215
//        Map.Entry entry;
216
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
217
218
        if ((timeInfo != null) && (StringUtils.isNotEmpty(timeInfo.getStartTime())) && (StringUtils.isNotEmpty(timeInfo.getEndTime()))){
219
            boolQueryBuilder.must(QueryBuilders.rangeQuery(timeInfo.getFieldName()).gte(timeInfo.getStartTime()).lt(timeInfo.getEndTime()));
220
        } else if ((timeInfo != null) && (StringUtils.isNotEmpty(timeInfo.getStartTime()))){
221
            boolQueryBuilder.must(QueryBuilders.rangeQuery(timeInfo.getFieldName()).gte(timeInfo.getStartTime()));
222
        }
223
        else if ((timeInfo != null) && (StringUtils.isNotEmpty(timeInfo.getStartTime()))) {
224
            boolQueryBuilder.must(QueryBuilders.rangeQuery(timeInfo.getFieldName()).lt(timeInfo.getEndTime()));
225
        }
226
227
        for (TermsQueryBuilder termsAggregationBuilder : list) {
228
            boolQueryBuilder.must(termsAggregationBuilder);
229
        }
230
        sourceBuilder.query(boolQueryBuilder);
231
        if (pageInfo != null) {
232
            sourceBuilder.from(pageInfo.getStartNumber()).size(pageInfo.getPageSize());
233
        }
234
        if ((sortMap != null) && (sortMap.containsKey("sortFieldName")) && (sortMap.containsKey("sortType"))) {
235
            SortBuilder sortBuilder = SortBuilders.fieldSort((String)sortMap.get("sortFieldName"));
236
            String sortType = (String)sortMap.get("sortType");
237
            if ("ASC".equals(sortType)) {
238
                sortBuilder.order(SortOrder.ASC);
239
            }else {
240
                sortBuilder.order(SortOrder.DESC);
241
            }
242
            sourceBuilder.sort(sortBuilder);
243
        }
244
245
        searchRequest.indices(new String[] { connectionName });
246
        searchRequest.source(sourceBuilder);
247
        searchRequest.searchType(SearchType.DFS_QUERY_THEN_FETCH);
248
249
        SearchResponse searchResponse = null;
250
        try {
251
            searchResponse = this.client.search(searchRequest, RequestOptions.DEFAULT);
252
        } catch (IOException e) {
253
            this.log.error("elastic client.search error" + e.getLocalizedMessage());
254
            e.printStackTrace();
255
        }
256
        this.log.debug("searchResponse=" + searchResponse);
257
258
        ElasticPage elasticPage = new ElasticPage();
259
        long totalSize = searchResponse.getHits().getTotalHits().value;
260
        Iterator serarchHits = searchResponse.getHits().iterator();
261
        List listResult = new ArrayList();
262
        while (serarchHits.hasNext()) {
263
            SearchHit searchHit = (SearchHit)serarchHits.next();
264
            JSONObject jsonObject = JSONObject.parseObject(searchHit.getSourceAsString());
265
            listResult.add(jsonObject);
266
        }
267
        this.log.debug("listResult=" + listResult);
268
269
        elasticPage.setTotalSize(totalSize);
270
        elasticPage.setResults(listResult);
271
272
        return elasticPage;
273
    }
274
}