目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、activiti7默认会生成25张表,是否要分库?
在一般业务库中,肯定是需要将activiti生成的库与原来的库要进行分库的,多数据源该如何配置?我提供了最简单的配置方法多数据源配置 ,只要按照我上面的步骤一步步做就可以了。
二、引入activiti7的项目依赖,配置propertis
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.0.0.SR1</version>
</dependency>
#activiti相关配置
spring.activiti.database-schema-update=true
spring.activiti.db-history-used=true
spring.activiti.history-level=full
如果你的项目用的是Mybaits-plus或者其他版本的Mybaits那么这个画面肯定不陌生
从报错我们可以看出是找不到在Mybaits-3.4.2中getLanguageDriver的方法, 等等 咱们项目用的不是Mybaits-plus吗? 这玩意肯定是activiti带过来的
好了找到原因 直接排除jar包就好了
三、引入activiti7的依赖后,我们自己本地访问API直接401
activiti7是默认将SpringSecurity集成过来的,所以虽然我们现在访问的是本地环境也是需要认证了,但是我们的微服务是在线上不需要认证的,那是认证微服务干的事情,需要让用户开2遍门吗? 认证两次? 当然不是, 我们直接将我们的微服务涉及到认证的操作所有API统统放行就好了。
/**
* @author candy
* @description
* @date 2022/03/30 10:42 上午
*/
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.anyRequest().permitAll()
.and()
.logout().permitAll();
}
}
四、直接调用processRuntime方法显示不允许访问
五、下面重点来了!!
1 . 还需要再引入两个类:
/**
* @description:
* @author: Candy
* @date: 2022-03-31 19:26
**/
@Configuration
public class SecurityConfig {
@Autowired
private UserService userService;
@Bean
@SuppressWarnings("unchecked")
public UserDetailsService myUserDetailsService() {
InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager();
BaseResp baseResp = userService.queryList(new HashMap<>());
List<Map<String, String>> users = (List<Map<String, String>>) baseResp.getData();
for (Map<String, String> user : users) {
List<SimpleGrantedAuthority> list = new ArrayList<>();
String roleCodes = "ROLE_ACTIVITI_USER";
if (StrUtil.isNotBlank(roleCodes)) {
list = Arrays.stream(roleCodes.split(",")).map(SimpleGrantedAuthority::new).collect(Collectors.toList());
}
if (user.get("userName").equals("管理员")){
continue;
}
inMemoryUserDetailsManager.createUser(new User(user.get("userName"), passwordEncoder().encode(user.get("password")), list));
}
return inMemoryUserDetailsManager;
}
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
重要提醒: 这里主要的逻辑是我调用认证微服务的接口将认证微服务的用户加载到我的服务的用户内存中,但是这里有两大坑!!!
- 用户名称不能叫做"管理员",放入InMemoryUserDetailsManager内存用户名称不能叫这个,不然报错。这个应该是底层的源代码对名称做了限制。我的做法是直接跳过。毕竟我们是测试环境,线上用户名称不会叫管理员的
- 加入自己的微服务的用户角色必须是"ROLE_ACTIVITI_USER", 一开始我写的是"ACTIVITI_USER", 我通过阅读processRuntime源代码,发现访问这个类必须要有角色"ACTIVITI_USER",但是SpringSecurity识别角色的时候必须添加"ROLE_"前缀!!!
提示: 我们在阅读源代码的时候记得将源代码downLoad下来,不然我们会错过一些重要的提示
2.还需要引入:
/**
* @description:
* @author: Candy
* @date: 2022-03-31 20:22
**/
@Component
@Slf4j
public class SecurityUtil {
@Autowired
@Qualifier("myUserDetailsService")
private UserDetailsService userDetailsService;
public void logInAs(String userName) {
UserDetails user = userDetailsService.loadUserByUsername(userName);
if (Objects.isNull(user)) {
throw new IllegalStateException("User" + userName + "doesn't exist,please provide a valid user");
}
log.info(">Logged in as : {}", userName);
SecurityContextHolder.setContext(new SecurityContextImpl(new Authentication() {
private static final long serialVersionUID = 2867107461657246492L;
@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 b) throws IllegalArgumentException {
}
@Override
public String getName() {
return user.getUsername();
}
}));
org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(userName);
}
}
提示: 这里的主要逻辑是用我们自己定义的UserDetailsService替换掉Spring容器里的UserDetailsService,然后调用loadUserByUsername()方法进行登录
接下来我们再访问方法的时候,直接登录,调用processRuntime的API就不会报错了