美文网首页
一、工作流 Activiti7-27.taskCandidate

一、工作流 Activiti7-27.taskCandidate

作者: 那钱有着落吗 | 来源:发表于2021-04-14 09:31 被阅读0次

    了解过 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

    其中这两个表我个人感觉就可以尝试着查询查看了,这个思路理论可行,但是实践起来还是要考虑很多问题的。

    相关文章

      网友评论

          本文标题:一、工作流 Activiti7-27.taskCandidate

          本文链接:https://www.haomeiwen.com/subject/hkfclltx.html