微服务登录问题:
解决方式:
我们使用客户端Token+oauth2+jwt+springsecurity
oauth2:简易,开放,安全,不接触账号密码
oauth2四种模式:
- 授权码模式
- 简化模式:没有授权码,直接token,安全性降低
- 密码模式:一般在自己系统中用(不接触三方)
- 客户端模式:不要用户名密码,直接返回token,在自己的服务器中使用,比如认证服务访问资源模式,你来访问我就直接返回token
- 实现
- 建立几个微服务
- 1导包
- 2搭建eureka,配置yml 注册eureka
- 3搭建zuul 配置zuul
- 4搭建resource 注册到eureka,开启zuul
- 5搭建auth,注册到eureka,开启zuul
- 6集成auth2
- 导包
- 7auth集成mybatis
- 导入数据库到hrm-auth
- 自定义UserDetailService
- 根据name查询用户 基本判断用户
- 查询所拥有的权限
- 把用户和权限封装成一个UserDetailService
- 把用户转成user 传参 用户名 密码 权限
- 权限装成他所需要的集合
- 返回一个UserDetailService
@Component
public class MyUserDetailService implements UserDetailsService {
@Autowired
private MyUserMapper myUserMapper;
@Autowired
private PermissionMapper permissionMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//通过username查询
MyUser myUser = myUserMapper.loadByUsername(username);
if(myUser==null){
System.out.println(username + "用户不存在");
}
//通过用户查询所拥有的权限
List<Permission> permissions = permissionMapper.loadByMyUserId(myUser.getId());
List<SimpleGrantedAuthority> authorities=new ArrayList<>();
permissions.forEach(permission -> {
authorities.add(new SimpleGrantedAuthority(permission.getExpression()));
});
//转成需要的数组
//参数需要 String username, String password, Collection<? extends GrantedAuthority> authorities
User user=new User(myUser.getUsername(),myUser.getPassword(),authorities);
return user;
}
}
- 配置springsecurity
- 1继承websecurityConfigureAdapter
- 2配置
- 3开启springsecurity
- 4密码匹配器
- 5重写configure方法
/**
* 对security安全配置
*/
@Configuration//相当于在xml 里面配置了bean
@EnableWebSecurity(debug = false