了解过 Activiti 7 的朋友们都知道 7版本加入了Security 的安全框架,而 taskService.createTaskQuery().taskCandidateUser(userId).list() 这个taskCandidateUser方法使用Security的验证导致的问题
思路1-做好安全框架的登录验证操作
既然taskCandidateUser使用了安全框架,我们要找候选任务可以有两个方式:
- 1.做好安全框架的登录验证操作
- 2.绕开安全框架,直接采用数据库查表的方式查询任务(未验证,仅提供思路)
第一点因为我个人已经在项目中使用所以就详细介绍第一种,下面是代码:
@Configuration
public class DemoApplicationConfiguration {
@Bean
public UserDetailsService myUserDetailsService() {
return SecurityUtil.findInstance();
}
}
@Component
public class SecurityUtil {
private Logger logger = LoggerFactory.getLogger(SecurityUtil.class);
private static InMemoryUserDetailsManager inMemoryUserDetailsManager;
//查询实例
public static InMemoryUserDetailsManager findInstance(){
if(inMemoryUserDetailsManager==null){
inMemoryUserDetailsManager = new InMemoryUserDetailsManager();
}
return inMemoryUserDetailsManager;
}
public void createUser(String userName) {
inMemoryUserDetailsManager = findInstance();
if(inMemoryUserDetailsManager.userExists(userName)) {
inMemoryUserDetailsManager.deleteUser(userName);
}
List<SimpleGrantedAuthority> roles = new ArrayList<SimpleGrantedAuthority>(){{
add(new SimpleGrantedAuthority("ROLE_ACTIVITI_USER"));
add(new SimpleGrantedAuthority("GROUP_activitiTeam"));
}};
inMemoryUserDetailsManager.createUser(new User(userName, passwordEncoder().encode("password"),roles));
}
public void logInAs(String username) {
createUser(username);
UserDetails user = findInstance().loadUserByUsername(username);
if (user == null) {
throw new IllegalStateException("User " + username + " doesn't exist, please provide a valid user");
}
logger.info("> Logged in as: " + username);
SecurityContextHolder.setContext(new SecurityContextImpl(new Authentication() {
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return user.getAuthorities();
}
@Override
public Object getCredentials() {
return user.getPassword();
}
@Override
public Object getDetails() {
return user;
}
@Override
public Object getPrincipal() {
return user;
}
@Override
public boolean isAuthenticated() {
return true;
}
@Override
public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
}
@Override
public String getName() {
return user.getUsername();
}
}));
org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(username);
}
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
image.png
将传过来的username使用内存的方式存储到安全框架的缓存中,这种方式就相当于做了一个虚拟的用户验证方式一样通过验证,所以如果工作流可以使用Security那么最好与Security结合起来,如果不行,那么这个方式就是取巧的感觉不太好的方式了。
最后一个图片就是实际的使用了。
思路2-直接查库的方式(未实现,仅提供思路,有时间精力的可以多多研究)
Activiti7实现的工作流其实就是设计了一堆表,然后一堆逻辑代码,把流程所有功能实现,所以数据还是存储在数据库中,我们如果能对表非常熟悉,那么查库的方式应该是没有问题的
下面提供几个表作为参考:
image.png image.png其中这两个表我个人感觉就可以尝试着查询查看了,这个思路理论可行,但是实践起来还是要考虑很多问题的。
网友评论