先来看整体思路。
我们用 CAS Server 做单点登录,CAS Server 主要是负责认证的,也就是它主要解决登录问题。登录成功之后,还有一个权限处理的问题,权限的问题则交由各个 CAS Client 自行处理,并不在 CAS Server 中完成。
在上篇文章中,松哥有教过大家定义 UserDetailsService,不知道大家是否还记得如下代码(忘记了可以参考上篇文章:Spring Boot 实现单点登录的第三种方案!):
@Component
@Primary
public class UserDetailsServiceImpl implements UserDetailsService{
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
return new User(s, “123”, true, true, true, true,
AuthorityUtils.createAuthorityList(“ROLE_user”));
}
}
这段代码是在什么时候执行呢?
如果我们没有使用 CAS 这一套的话,这段代码当然是在用户登录的时候执行,用户登录时,从数据库中查询用户的信息,然后做校验(参考本系列前面文章就懂)。
如果我们使用 CAS 这一套,用户登录的校验将在 CAS Server 上执行,CAS Client 就不用做校验工作了,但是为什么我们还需要定义 UserDetailsService 呢?这是为了当用户在 CAS Server 上登录成功之后,拿着用户名回到 CAS Client,然后我们再去数据库中根据用户名获取用户的详细信息,包括用户的角色等,进而在后面的鉴权中用上角色。
好了,这是我们一个大致的思路,接下来我们来看具体实现。
接下来的配置在 松哥手把手教你入门 Spring Boot + CAS 单点登录 一文的基础上完成,所以还没看前面文章的小伙伴建议先看一下哦。
2.1 准备工作
首先我们先在数据库中准备一下用户表、角色表以及用户角色关联表:
CREATE TABLE t_role
(
id
bigint(20) NOT NULL AUTO_INCREMENT,
name
varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
name_zh
varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,