activiti with spring security example (#2909)
This commit is contained in:
parent
bc899ef38f
commit
8e04a06bc9
@ -19,9 +19,11 @@
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
<start-class>com.example.activitiwithspring.ActivitiWithSpringApplication</start-class>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
<java.version>1.8</java.version>
|
||||
<activiti.version>6.0.0</activiti.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
@ -30,9 +32,14 @@
|
||||
<artifactId>activiti-spring-boot-starter-basic</artifactId>
|
||||
<version>6.0.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.activiti</groupId>
|
||||
<artifactId>activiti-spring-boot-starter-security</artifactId>
|
||||
<version>${activiti.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
|
BIN
spring-activiti/src/main/java/com/baeldung/activiti/security.rar
Normal file
BIN
spring-activiti/src/main/java/com/baeldung/activiti/security.rar
Normal file
Binary file not shown.
@ -0,0 +1,20 @@
|
||||
package com.baeldung.activiti.security.config;
|
||||
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
||||
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
|
||||
|
||||
@Configuration
|
||||
@EnableWebMvc
|
||||
public class MvcConfig extends WebMvcConfigurerAdapter {
|
||||
|
||||
@Override
|
||||
public void addViewControllers(ViewControllerRegistry registry) {
|
||||
registry.addViewController("/login")
|
||||
.setViewName("login");
|
||||
registry.addViewController("/homepage")
|
||||
.setViewName("homepage");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
package com.baeldung.activiti.security.config;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.activiti.engine.IdentityService;
|
||||
import org.activiti.engine.RuntimeService;
|
||||
import org.activiti.engine.TaskService;
|
||||
import org.activiti.engine.runtime.ProcessInstance;
|
||||
import org.activiti.engine.task.Task;
|
||||
import org.activiti.spring.SpringProcessEngineConfiguration;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
public class ProcessController {
|
||||
|
||||
@Autowired
|
||||
private RuntimeService runtimeService;
|
||||
|
||||
@Autowired
|
||||
private TaskService taskService;
|
||||
|
||||
@Autowired
|
||||
private IdentityService identityService;
|
||||
|
||||
@Autowired
|
||||
SpringProcessEngineConfiguration config;
|
||||
|
||||
@GetMapping("/protected-process")
|
||||
public String startProcess() {
|
||||
|
||||
String userId = SecurityContextHolder.getContext()
|
||||
.getAuthentication()
|
||||
.getName();
|
||||
|
||||
identityService.setAuthenticatedUserId(userId);
|
||||
|
||||
ProcessInstance pi = runtimeService.startProcessInstanceByKey("protected-process");
|
||||
|
||||
List<Task> usertasks = taskService.createTaskQuery()
|
||||
.processInstanceId(pi.getId())
|
||||
.list();
|
||||
|
||||
taskService.complete(usertasks.iterator()
|
||||
.next()
|
||||
.getId());
|
||||
|
||||
return "Process started. Number of currently running process instances = " + runtimeService.createProcessInstanceQuery()
|
||||
.count();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,86 @@
|
||||
package com.baeldung.activiti.security.config;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.activiti.engine.identity.Group;
|
||||
import org.activiti.engine.identity.GroupQuery;
|
||||
import org.activiti.engine.impl.GroupQueryImpl;
|
||||
import org.activiti.engine.impl.Page;
|
||||
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||
import org.activiti.engine.impl.persistence.entity.GroupEntityImpl;
|
||||
import org.activiti.engine.impl.persistence.entity.GroupEntityManagerImpl;
|
||||
import org.activiti.engine.impl.persistence.entity.data.GroupDataManager;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
import org.springframework.security.provisioning.JdbcUserDetailsManager;
|
||||
|
||||
public class SpringSecurityGroupManager extends GroupEntityManagerImpl {
|
||||
|
||||
private JdbcUserDetailsManager userManager;
|
||||
|
||||
public SpringSecurityGroupManager(ProcessEngineConfigurationImpl processEngineConfiguration, GroupDataManager groupDataManager) {
|
||||
super(processEngineConfiguration, groupDataManager);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Group> findGroupByQueryCriteria(GroupQueryImpl query, Page page) {
|
||||
|
||||
if (query.getUserId() != null) {
|
||||
return findGroupsByUser(query.getUserId());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long findGroupCountByQueryCriteria(GroupQueryImpl query) {
|
||||
return findGroupByQueryCriteria(query, null).size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Group> findGroupsByUser(String userId) {
|
||||
UserDetails userDetails = userManager.loadUserByUsername(userId);
|
||||
System.out.println("group manager");
|
||||
if (userDetails != null) {
|
||||
List<Group> groups = userDetails.getAuthorities()
|
||||
.stream()
|
||||
.map(a -> a.getAuthority())
|
||||
.map(a -> {
|
||||
Group g = new GroupEntityImpl();
|
||||
g.setId(a);
|
||||
return g;
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
return groups;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setUserManager(JdbcUserDetailsManager userManager) {
|
||||
this.userManager = userManager;
|
||||
}
|
||||
|
||||
public Group createNewGroup(String groupId) {
|
||||
throw new UnsupportedOperationException("This operation is not supported!");
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(String groupId) {
|
||||
throw new UnsupportedOperationException("This operation is not supported!");
|
||||
|
||||
}
|
||||
|
||||
public GroupQuery createNewGroupQuery() {
|
||||
throw new UnsupportedOperationException("This operation is not supported!");
|
||||
}
|
||||
|
||||
public List<Group> findGroupsByNativeQuery(Map<String, Object> parameterMap, int firstResult, int maxResults) {
|
||||
throw new UnsupportedOperationException("This operation is not supported!");
|
||||
}
|
||||
|
||||
public long findGroupCountByNativeQuery(Map<String, Object> parameterMap) {
|
||||
throw new UnsupportedOperationException("This operation is not supported!");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,144 @@
|
||||
package com.baeldung.activiti.security.config;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.activiti.engine.identity.Group;
|
||||
import org.activiti.engine.identity.User;
|
||||
import org.activiti.engine.identity.UserQuery;
|
||||
import org.activiti.engine.impl.Page;
|
||||
import org.activiti.engine.impl.UserQueryImpl;
|
||||
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||
import org.activiti.engine.impl.persistence.entity.GroupEntityImpl;
|
||||
import org.activiti.engine.impl.persistence.entity.UserEntity;
|
||||
import org.activiti.engine.impl.persistence.entity.UserEntityImpl;
|
||||
import org.activiti.engine.impl.persistence.entity.UserEntityManagerImpl;
|
||||
import org.activiti.engine.impl.persistence.entity.data.UserDataManager;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
import org.springframework.security.provisioning.JdbcUserDetailsManager;
|
||||
|
||||
public class SpringSecurityUserManager extends UserEntityManagerImpl {
|
||||
|
||||
private JdbcUserDetailsManager userManager;
|
||||
|
||||
public SpringSecurityUserManager(ProcessEngineConfigurationImpl processEngineConfiguration, UserDataManager userDataManager, JdbcUserDetailsManager userManager) {
|
||||
super(processEngineConfiguration, userDataManager);
|
||||
this.userManager = userManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserEntity findById(String userId) {
|
||||
UserDetails userDetails = userManager.loadUserByUsername(userId);
|
||||
if (userDetails != null) {
|
||||
UserEntityImpl user = new UserEntityImpl();
|
||||
user.setId(userId);
|
||||
return user;
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<User> findUserByQueryCriteria(UserQueryImpl query, Page page) {
|
||||
List<User> users = null;
|
||||
if (query.getGroupId() != null) {
|
||||
users = userManager.findUsersInGroup(query.getGroupId())
|
||||
.stream()
|
||||
.map(username -> {
|
||||
User user = new UserEntityImpl();
|
||||
user.setId(username);
|
||||
return user;
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
if (page != null) {
|
||||
return users.subList(page.getFirstResult(), page.getFirstResult() + page.getMaxResults());
|
||||
|
||||
}
|
||||
return users;
|
||||
}
|
||||
|
||||
if (query.getId() != null) {
|
||||
UserDetails userDetails = userManager.loadUserByUsername(query.getId());
|
||||
if (userDetails != null) {
|
||||
UserEntityImpl user = new UserEntityImpl();
|
||||
user.setId(query.getId());
|
||||
return Collections.singletonList(user);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean checkPassword(String userId, String password) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void setUserManager(JdbcUserDetailsManager userManager) {
|
||||
this.userManager = userManager;
|
||||
}
|
||||
|
||||
public User createNewUser(String userId) {
|
||||
throw new UnsupportedOperationException("This operation is not supported!");
|
||||
}
|
||||
|
||||
public void updateUser(User updatedUser) {
|
||||
throw new UnsupportedOperationException("This operation is not supported!");
|
||||
|
||||
}
|
||||
|
||||
public void delete(UserEntity userEntity) {
|
||||
throw new UnsupportedOperationException("This operation is not supported!");
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deletePicture(User user) {
|
||||
UserEntity userEntity = (UserEntity) user;
|
||||
if (userEntity.getPictureByteArrayRef() != null) {
|
||||
userEntity.getPictureByteArrayRef()
|
||||
.delete();
|
||||
}
|
||||
}
|
||||
|
||||
public void delete(String userId) {
|
||||
throw new UnsupportedOperationException("This operation is not supported!");
|
||||
|
||||
}
|
||||
|
||||
public long findUserCountByQueryCriteria(UserQueryImpl query) {
|
||||
return findUserByQueryCriteria(query, null).size();
|
||||
}
|
||||
|
||||
public List<Group> findGroupsByUser(String userId) {
|
||||
UserDetails userDetails = userManager.loadUserByUsername(userId);
|
||||
if (userDetails != null) {
|
||||
List<Group> groups = userDetails.getAuthorities()
|
||||
.stream()
|
||||
.map(a -> a.getAuthority())
|
||||
.map(a -> {
|
||||
Group g = new GroupEntityImpl();
|
||||
g.setId(a);
|
||||
return g;
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
return groups;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public UserQuery createNewUserQuery() {
|
||||
throw new UnsupportedOperationException("This operation is not supported!");
|
||||
}
|
||||
|
||||
public List<User> findUsersByNativeQuery(Map<String, Object> parameterMap, int firstResult, int maxResults) {
|
||||
throw new UnsupportedOperationException("This operation is not supported!");
|
||||
}
|
||||
|
||||
public long findUserCountByNativeQuery(Map<String, Object> parameterMap) {
|
||||
throw new UnsupportedOperationException("This operation is not supported!");
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
package com.baeldung.activiti.security.withactiviti;
|
||||
|
||||
import org.activiti.engine.IdentityService;
|
||||
import org.activiti.spring.security.IdentityServiceUserDetailsService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
|
||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
|
||||
|
||||
@Configuration
|
||||
public class SecurityConfig extends WebSecurityConfigurerAdapter {
|
||||
|
||||
protected void configure(HttpSecurity http) throws Exception {
|
||||
http.antMatcher("/**")
|
||||
.authorizeRequests()
|
||||
.antMatchers("/protected-process*")
|
||||
.authenticated()
|
||||
.anyRequest()
|
||||
.permitAll()
|
||||
.and()
|
||||
.formLogin()
|
||||
.loginPage("/login")
|
||||
.defaultSuccessUrl("/homepage")
|
||||
.failureUrl("/login?error=true")
|
||||
.and()
|
||||
.csrf()
|
||||
.disable()
|
||||
.logout()
|
||||
.logoutSuccessUrl("/login");
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private IdentityService identityService;
|
||||
|
||||
@Bean
|
||||
public IdentityServiceUserDetailsService userDetailsService() {
|
||||
return new IdentityServiceUserDetailsService(identityService);
|
||||
}
|
||||
|
||||
@Autowired
|
||||
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
|
||||
auth.userDetailsService(userDetailsService());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
package com.baeldung.activiti.security.withactiviti;
|
||||
|
||||
import org.activiti.engine.IdentityService;
|
||||
import org.activiti.engine.identity.Group;
|
||||
import org.activiti.engine.identity.User;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
|
||||
@SpringBootApplication(scanBasePackages = { "com.baeldung.activiti.security.config", "com.baeldung.activiti.security.withactiviti" })
|
||||
public class SpringSecurityActivitiApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(SpringSecurityActivitiApplication.class, args);
|
||||
}
|
||||
|
||||
@Bean
|
||||
InitializingBean usersAndGroupsInitializer(IdentityService identityService) {
|
||||
return new InitializingBean() {
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
User user = identityService.newUser("activiti_user");
|
||||
user.setPassword("pass");
|
||||
identityService.saveUser(user);
|
||||
|
||||
Group group = identityService.newGroup("user");
|
||||
group.setName("ROLE_USER");
|
||||
group.setType("USER");
|
||||
identityService.saveGroup(group);
|
||||
identityService.createMembership(user.getId(), group.getId());
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
package com.baeldung.activiti.security.withspring;
|
||||
|
||||
import org.activiti.engine.impl.persistence.entity.data.impl.MybatisGroupDataManager;
|
||||
import org.activiti.engine.impl.persistence.entity.data.impl.MybatisUserDataManager;
|
||||
import org.activiti.spring.SpringProcessEngineConfiguration;
|
||||
import org.activiti.spring.boot.SecurityAutoConfiguration;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.security.provisioning.JdbcUserDetailsManager;
|
||||
|
||||
import com.baeldung.activiti.security.config.SpringSecurityGroupManager;
|
||||
import com.baeldung.activiti.security.config.SpringSecurityUserManager;
|
||||
|
||||
@SpringBootApplication(exclude = SecurityAutoConfiguration.class, scanBasePackages = { "com.baeldung.activiti.security.config", "com.baeldung.activiti.security.withspring" })
|
||||
public class ActivitiSpringSecurityApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(ActivitiSpringSecurityApplication.class, args);
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private SpringProcessEngineConfiguration processEngineConfiguration;
|
||||
|
||||
@Autowired
|
||||
private JdbcUserDetailsManager userManager;
|
||||
|
||||
@Bean
|
||||
InitializingBean processEngineInitializer() {
|
||||
return new InitializingBean() {
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
processEngineConfiguration.setUserEntityManager(new SpringSecurityUserManager(processEngineConfiguration, new MybatisUserDataManager(processEngineConfiguration), userManager));
|
||||
processEngineConfiguration.setGroupEntityManager(new SpringSecurityGroupManager(processEngineConfiguration, new MybatisGroupDataManager(processEngineConfiguration)));
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
package com.baeldung.activiti.security.withspring;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
|
||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
|
||||
import org.springframework.security.provisioning.JdbcUserDetailsManager;
|
||||
|
||||
@Configuration
|
||||
public class SecurityConfig extends WebSecurityConfigurerAdapter {
|
||||
|
||||
@Autowired
|
||||
private DataSource dataSource;
|
||||
|
||||
protected void configure(HttpSecurity http) throws Exception {
|
||||
http.antMatcher("/**")
|
||||
.authorizeRequests()
|
||||
.antMatchers("/protected-process*")
|
||||
.authenticated()
|
||||
.anyRequest()
|
||||
.permitAll()
|
||||
.and()
|
||||
.formLogin()
|
||||
.loginPage("/login")
|
||||
.defaultSuccessUrl("/homepage")
|
||||
.failureUrl("/login?error=true")
|
||||
.and()
|
||||
.csrf()
|
||||
.disable()
|
||||
.logout()
|
||||
.logoutSuccessUrl("/login");
|
||||
}
|
||||
|
||||
@Bean
|
||||
public JdbcUserDetailsManager userDetailsManager() {
|
||||
JdbcUserDetailsManager manager = new JdbcUserDetailsManager();
|
||||
manager.setDataSource(dataSource);
|
||||
return manager;
|
||||
}
|
||||
|
||||
@Autowired
|
||||
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
|
||||
auth.userDetailsService(userDetailsManager());
|
||||
}
|
||||
|
||||
}
|
3
spring-activiti/src/main/resources/data.sql
Normal file
3
spring-activiti/src/main/resources/data.sql
Normal file
@ -0,0 +1,3 @@
|
||||
insert into users(username, password, enabled) values ('spring_user', 'pass', true);
|
||||
|
||||
insert into authorities(username, authority) values ('spring_user','ROLE_USER');
|
@ -0,0 +1,41 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 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" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef" xmlns:modeler="http://activiti.com/modeler" modeler:version="1.0ev" modeler:exportDateTime="20170726123124" modeler:modelId="1005315" modeler:modelVersion="1" modeler:modelLastUpdated="1501068675875">
|
||||
<process id="protected-process" name="protected-process" isExecutable="true">
|
||||
<startEvent id="startEvent" name="startEvent">
|
||||
</startEvent>
|
||||
<sequenceFlow id="sequence-flow-1" sourceRef="startEvent" targetRef="A">
|
||||
</sequenceFlow>
|
||||
<userTask id="A" name="A">
|
||||
<potentialOwner>
|
||||
<resourceAssignmentExpression>
|
||||
<formalExpression>ROLE_USER</formalExpression>
|
||||
</resourceAssignmentExpression>
|
||||
</potentialOwner>
|
||||
</userTask>
|
||||
<sequenceFlow id="sequence-flow-2" sourceRef="A" targetRef="endEvent">
|
||||
</sequenceFlow>
|
||||
<endEvent id="endEvent" name="endEvent">
|
||||
</endEvent>
|
||||
</process>
|
||||
<bpmndi:BPMNDiagram id="BPMNDiagram_protected-process">
|
||||
<bpmndi:BPMNPlane bpmnElement="protected-process" id="BPMNPlane_protected-process">
|
||||
<bpmndi:BPMNShape bpmnElement="startEvent" id="BPMNShape_startEvent">
|
||||
<omgdc:Bounds height="30.0" width="30.0" x="120.0" y="163.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="endEvent" id="BPMNShape_endEvent">
|
||||
<omgdc:Bounds height="28.0" width="28.0" x="365.0" y="164.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="A" id="BPMNShape_A">
|
||||
<omgdc:Bounds height="80.0" width="100.0" x="210.0" y="138.0"/>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNEdge bpmnElement="sequence-flow-1" id="BPMNEdge_sequence-flow-1">
|
||||
<omgdi:waypoint x="150.0" y="178.0"/>
|
||||
<omgdi:waypoint x="210.0" y="178.0"/>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="sequence-flow-2" id="BPMNEdge_sequence-flow-2">
|
||||
<omgdi:waypoint x="310.0" y="178.0"/>
|
||||
<omgdi:waypoint x="365.0" y="178.0"/>
|
||||
</bpmndi:BPMNEdge>
|
||||
</bpmndi:BPMNPlane>
|
||||
</bpmndi:BPMNDiagram>
|
||||
</definitions>
|
3
spring-activiti/src/main/resources/schema.sql
Normal file
3
spring-activiti/src/main/resources/schema.sql
Normal file
@ -0,0 +1,3 @@
|
||||
create table users(username varchar(255), password varchar(255), enabled boolean);
|
||||
|
||||
create table authorities(username varchar(255),authority varchar(255));
|
21
spring-activiti/src/main/resources/templates/login.html
Normal file
21
spring-activiti/src/main/resources/templates/login.html
Normal file
@ -0,0 +1,21 @@
|
||||
<html>
|
||||
<head></head>
|
||||
<body>
|
||||
<h1>Login</h1>
|
||||
<form name='f' action="login" method='POST'>
|
||||
<table>
|
||||
<tr>
|
||||
<td>User:</td>
|
||||
<td><input type='text' name='username' value=''/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Password:</td>
|
||||
<td><input type='password' name='password' /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input name="submit" type="submit" value="submit" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,31 @@
|
||||
package com.example.activitiwithspring;
|
||||
|
||||
import org.activiti.engine.IdentityService;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
import org.springframework.test.context.web.WebAppConfiguration;
|
||||
|
||||
import com.baeldung.activiti.security.withspring.ActivitiSpringSecurityApplication;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(classes = ActivitiSpringSecurityApplication.class)
|
||||
@WebAppConfiguration
|
||||
public class ActivitiSpringSecurityIntegrationTest {
|
||||
@Autowired
|
||||
private IdentityService identityService;
|
||||
|
||||
@Test
|
||||
public void whenUserExists_thenOk() {
|
||||
identityService.setUserPicture("spring_user", null);
|
||||
}
|
||||
|
||||
@Test(expected = UsernameNotFoundException.class)
|
||||
public void whenUserNonExistent_thenSpringException() {
|
||||
identityService.setUserPicture("user3", null);
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user