Skip to content

Commit f7ab212

Browse files
committed
✨ activiti 测试
1 parent dd49987 commit f7ab212

File tree

5 files changed

+241
-0
lines changed

5 files changed

+241
-0
lines changed

spring-boot-demo-activiti/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@
5050
<groupId>mysql</groupId>
5151
<artifactId>mysql-connector-java</artifactId>
5252
</dependency>
53+
54+
<dependency>
55+
<groupId>org.projectlombok</groupId>
56+
<artifactId>lombok</artifactId>
57+
<optional>true</optional>
58+
</dependency>
5359
</dependencies>
5460

5561
<build>
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.xkcoding.activiti.config;
2+
3+
import lombok.extern.slf4j.Slf4j;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.Configuration;
6+
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
7+
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
8+
import org.springframework.security.core.authority.SimpleGrantedAuthority;
9+
import org.springframework.security.core.userdetails.User;
10+
import org.springframework.security.core.userdetails.UserDetailsService;
11+
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
12+
import org.springframework.security.crypto.password.PasswordEncoder;
13+
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
14+
15+
import java.util.Arrays;
16+
import java.util.List;
17+
import java.util.stream.Collectors;
18+
19+
/**
20+
* <p>
21+
* 安全配置类
22+
* </p>
23+
*
24+
* @package: com.xkcoding.activiti.config
25+
* @description: 安全配置类
26+
* @author: yangkai.shen
27+
* @date: Created in 2019-07-01 18:40
28+
* @copyright: Copyright (c) 2019
29+
* @version: V1.0
30+
* @modified: yangkai.shen
31+
*/
32+
@Slf4j
33+
@Configuration
34+
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
35+
36+
@Override
37+
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
38+
auth.userDetailsService(userDetailsService());
39+
}
40+
41+
@Bean
42+
protected UserDetailsService myUserDetailsService() {
43+
InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager();
44+
45+
String[][] usersGroupsAndRoles = {{"salaboy", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"}, {"ryandawsonuk", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"}, {"erdemedeiros", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"}, {"other", "password", "ROLE_ACTIVITI_USER", "GROUP_otherTeam"}, {"admin", "password", "ROLE_ACTIVITI_ADMIN"}};
46+
47+
for (String[] user : usersGroupsAndRoles) {
48+
List<String> authoritiesStrings = Arrays.asList(Arrays.copyOfRange(user, 2, user.length));
49+
log.info("> Registering new user: " + user[0] + " with the following Authorities[" + authoritiesStrings + "]");
50+
inMemoryUserDetailsManager.createUser(new User(user[0], passwordEncoder().encode(user[1]), authoritiesStrings
51+
.stream()
52+
.map(SimpleGrantedAuthority::new)
53+
.collect(Collectors.toList())));
54+
}
55+
56+
57+
return inMemoryUserDetailsManager;
58+
}
59+
60+
@Bean
61+
public PasswordEncoder passwordEncoder() {
62+
return new BCryptPasswordEncoder();
63+
}
64+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package com.xkcoding.activiti.util;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.security.core.Authentication;
6+
import org.springframework.security.core.GrantedAuthority;
7+
import org.springframework.security.core.context.SecurityContextHolder;
8+
import org.springframework.security.core.context.SecurityContextImpl;
9+
import org.springframework.security.core.userdetails.UserDetails;
10+
import org.springframework.security.core.userdetails.UserDetailsService;
11+
import org.springframework.stereotype.Component;
12+
13+
import java.util.Collection;
14+
15+
/**
16+
* <p>
17+
* 认证工具
18+
* </p>
19+
*
20+
* @package: com.xkcoding.activiti.util
21+
* @description: 认证工具
22+
* @author: yangkai.shen
23+
* @date: Created in 2019-07-01 18:38
24+
* @copyright: Copyright (c) 2019
25+
* @version: V1.0
26+
* @modified: yangkai.shen
27+
*/
28+
@Component
29+
@RequiredArgsConstructor(onConstructor_ = @Autowired)
30+
public class SecurityUtil {
31+
32+
private final UserDetailsService userDetailsService;
33+
34+
public void logInAs(String username) {
35+
36+
UserDetails user = userDetailsService.loadUserByUsername(username);
37+
if (user == null) {
38+
throw new IllegalStateException("User " + username + " doesn't exist, please provide a valid user");
39+
}
40+
41+
SecurityContextHolder.setContext(new SecurityContextImpl(new Authentication() {
42+
@Override
43+
public Collection<? extends GrantedAuthority> getAuthorities() {
44+
return user.getAuthorities();
45+
}
46+
47+
@Override
48+
public Object getCredentials() {
49+
return user.getPassword();
50+
}
51+
52+
@Override
53+
public Object getDetails() {
54+
return user;
55+
}
56+
57+
@Override
58+
public Object getPrincipal() {
59+
return user;
60+
}
61+
62+
@Override
63+
public boolean isAuthenticated() {
64+
return true;
65+
}
66+
67+
@Override
68+
public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
69+
70+
}
71+
72+
@Override
73+
public String getName() {
74+
return user.getUsername();
75+
}
76+
}));
77+
org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(username);
78+
}
79+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2+
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:yaoqiang="http://bpmn.sourceforge.net" exporter="Yaoqiang BPMN Editor" exporterVersion="5.3" expressionLanguage="http://www.w3.org/1999/XPath" id="m1544167269809" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL http://bpmn.sourceforge.net/schemas/BPMN20.xsd">
3+
<process id="myProcess_1" isClosed="false" isExecutable="true" processType="None">
4+
<extensionElements>
5+
<yaoqiang:description/>
6+
<yaoqiang:pageFormat height="841.8897637795276" imageableHeight="831.8897637795276" imageableWidth="588.1102362204724" imageableX="5.0" imageableY="5.0" orientation="0" width="598.1102362204724"/>
7+
<yaoqiang:page background="#FFFFFF" horizontalCount="1" verticalCount="1"/>
8+
</extensionElements>
9+
<startEvent id="_2" isInterrupting="true" name="StartEvent" parallelMultiple="false">
10+
<outgoing>_6</outgoing>
11+
<outputSet/>
12+
</startEvent>
13+
<userTask activiti:candidateGroups="activitiTeam" activiti:exclusive="true" completionQuantity="1" id="_3" implementation="##unspecified" isForCompensation="false" name="first" startQuantity="1">
14+
<incoming>_6</incoming>
15+
<outgoing>_7</outgoing>
16+
</userTask>
17+
<userTask activiti:candidateGroups="activitiTeam" activiti:exclusive="true" completionQuantity="1" id="_4" implementation="##unspecified" isForCompensation="false" name="second" startQuantity="1">
18+
<incoming>_7</incoming>
19+
<outgoing>_8</outgoing>
20+
</userTask>
21+
<endEvent id="_5" name="EndEvent">
22+
<incoming>_8</incoming>
23+
<inputSet/>
24+
</endEvent>
25+
<sequenceFlow id="_6" sourceRef="_2" targetRef="_3"/>
26+
<sequenceFlow id="_7" sourceRef="_3" targetRef="_4"/>
27+
<sequenceFlow id="_8" sourceRef="_4" targetRef="_5"/>
28+
</process>
29+
<bpmndi:BPMNDiagram id="Yaoqiang_Diagram-myProcess_1" name="New Diagram" resolution="96.0">
30+
<bpmndi:BPMNPlane bpmnElement="myProcess_1">
31+
<bpmndi:BPMNShape bpmnElement="_2" id="Yaoqiang-_2">
32+
<omgdc:Bounds height="32.0" width="32.0" x="65.0" y="80.0"/>
33+
<bpmndi:BPMNLabel>
34+
<omgdc:Bounds height="18.96" width="60.0" x="51.0" y="120.52"/>
35+
</bpmndi:BPMNLabel>
36+
</bpmndi:BPMNShape>
37+
<bpmndi:BPMNShape bpmnElement="_3" id="Yaoqiang-_3">
38+
<omgdc:Bounds height="55.0" width="85.0" x="170.0" y="115.0"/>
39+
<bpmndi:BPMNLabel>
40+
<omgdc:Bounds height="18.96" width="28.0" x="198.5" y="135.02"/>
41+
</bpmndi:BPMNLabel>
42+
</bpmndi:BPMNShape>
43+
<bpmndi:BPMNShape bpmnElement="_4" id="Yaoqiang-_4">
44+
<omgdc:Bounds height="55.0" width="85.0" x="310.0" y="155.0"/>
45+
<bpmndi:BPMNLabel>
46+
<omgdc:Bounds height="18.96" width="45.0" x="330.0" y="175.02"/>
47+
</bpmndi:BPMNLabel>
48+
</bpmndi:BPMNShape>
49+
<bpmndi:BPMNShape bpmnElement="_5" id="Yaoqiang-_5">
50+
<omgdc:Bounds height="32.0" width="32.0" x="505.0" y="220.0"/>
51+
<bpmndi:BPMNLabel>
52+
<omgdc:Bounds height="18.96" width="55.0" x="493.5" y="260.52"/>
53+
</bpmndi:BPMNLabel>
54+
</bpmndi:BPMNShape>
55+
<bpmndi:BPMNEdge bpmnElement="_8" id="Yaoqiang-_8">
56+
<omgdi:waypoint x="395.0" y="182.5"/>
57+
<omgdi:waypoint x="505.0" y="236.0"/>
58+
<bpmndi:BPMNLabel>
59+
<omgdc:Bounds height="18.96" width="6.0" x="447.0" y="199.77"/>
60+
</bpmndi:BPMNLabel>
61+
</bpmndi:BPMNEdge>
62+
<bpmndi:BPMNEdge bpmnElement="_7" id="Yaoqiang-_7">
63+
<omgdi:waypoint x="255.0" y="142.5"/>
64+
<omgdi:waypoint x="310.0" y="182.5"/>
65+
<bpmndi:BPMNLabel>
66+
<omgdc:Bounds height="18.96" width="6.0" x="279.5" y="153.02"/>
67+
</bpmndi:BPMNLabel>
68+
</bpmndi:BPMNEdge>
69+
<bpmndi:BPMNEdge bpmnElement="_6" id="Yaoqiang-_6">
70+
<omgdi:waypoint x="97.0" y="96.0"/>
71+
<omgdi:waypoint x="170.0" y="142.5"/>
72+
<bpmndi:BPMNLabel>
73+
<omgdc:Bounds height="18.96" width="6.0" x="130.5" y="109.77"/>
74+
</bpmndi:BPMNLabel>
75+
</bpmndi:BPMNEdge>
76+
</bpmndi:BPMNPlane>
77+
</bpmndi:BPMNDiagram>
78+
</definitions>

spring-boot-demo-activiti/src/test/java/com/xkcoding/activiti/SpringBootDemoActivitiApplicationTests.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
11
package com.xkcoding.activiti;
22

3+
import com.xkcoding.activiti.util.SecurityUtil;
4+
import org.activiti.api.process.model.ProcessDefinition;
5+
import org.activiti.api.process.runtime.ProcessRuntime;
6+
import org.activiti.api.runtime.shared.query.Page;
7+
import org.activiti.api.runtime.shared.query.Pageable;
38
import org.junit.Test;
49
import org.junit.runner.RunWith;
10+
import org.springframework.beans.factory.annotation.Autowired;
511
import org.springframework.boot.test.context.SpringBootTest;
612
import org.springframework.test.context.junit4.SpringRunner;
713

814
@RunWith(SpringRunner.class)
915
@SpringBootTest
1016
public class SpringBootDemoActivitiApplicationTests {
1117

18+
@Autowired
19+
private ProcessRuntime processRuntime;
20+
@Autowired
21+
private SecurityUtil securityUtil;
22+
1223
@Test
1324
public void contextLoads() {
25+
securityUtil.logInAs("salaboy");
26+
Page<ProcessDefinition> processDefinitionPage = processRuntime.processDefinitions(Pageable.of(0, 10));
27+
processDefinitionPage.getContent().forEach(System.out::println);
1428
}
1529

1630
}

0 commit comments

Comments
 (0)