一、工作流 Activiti7-27.taskCandidate

2021-04-14  本文已影响0人  那钱有着落吗

了解过 Activiti 7 的朋友们都知道 7版本加入了Security 的安全框架,而 taskService.createTaskQuery().taskCandidateUser(userId).list() 这个taskCandidateUser方法使用Security的验证导致的问题

思路1-做好安全框架的登录验证操作

既然taskCandidateUser使用了安全框架,我们要找候选任务可以有两个方式:

第一点因为我个人已经在项目中使用所以就详细介绍第一种,下面是代码:


@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

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

上一篇下一篇

猜你喜欢

热点阅读