springboot对接cas服务_SpringBoot+CAS单点登录,如何对
接数据库?
在前⾯的两篇⽂章中,松哥和⼤家分享了 CAS Server 的搭建以及如何使⽤ Spring Security 搭建 CAS Client。
但是前⾯的案例有⼀个问题,就是登录⽤户是在 CAS Server 配置⽂件中写死的,没有对接数据库,实际项⽬中,这⾥肯定要对接数据
库,所以今天,松哥就来和⼤家聊⼀聊 CAS Server 如何对接数据库。
松哥最近和 Spring Security 杠上了,这是 Spring Security 系列的第 25 篇:
1. 挖⼀个⼤坑,Spring Security 开搞!
2. 松哥⼿把⼿带你⼊门 Spring Security,别再问密码怎么解密了
3. ⼿把⼿教你定制 Spring Security 中的表单登录
4. Spring Security 做前后端分离,咱就别做页⾯跳转了!统统 JSON 交互
5. Spring Security 中的授权操作原来这么简单
6. Spring Security 如何将⽤户数据存⼊数据库?
7. Spring Security+Spring Data Jpa 强强联⼿,安全管理只有更简单!
8. Spring Boot + Spring Security 实现⾃动登录功能
9. Spring Boot ⾃动登录,安全风险要怎么控制?
10. 在微服务项⽬中,Spring Security ⽐ Shiro 强在哪?
11. SpringSecurity ⾃定义认证逻辑的两种⽅式(⾼级玩法)
12. Spring Security 中如何快速查看登录⽤户 IP 地址等信息?
13. Spring Security ⾃动踢掉前⼀个登录⽤户,⼀个配置搞定!
14. Spring Boot + Vue 前后端分离项⽬,如何踢掉已登录⽤户?
15. Spring Security ⾃带防⽕墙!你都不知道⾃⼰的系统有多安全!
16. 什么是会话固定攻击?Spring Boot 中要如何防御会话固定攻击?
17. 集化部署,Spring Security 要如何处理 session 共享?
18. 松哥⼿把⼿教你在 SpringBoot 中防御 CSRF 攻击!so easy!
19. 要学就学透彻!Spring Security 中 CSRF 防御源码解析
20. Spring Boot 中密码加密的两种姿势!
21. Spring Security 要怎么学?为什么⼀定要成体系的学习?
22. Spring Security 两种资源放⾏策略,千万别⽤错了!
23. 聊⼀聊 Spring Boot 中的 CAS 单点登录
24. Spring Boot 实现单点登录的第三种⽅案!
1.整体思路
先来看整体思路。
我们⽤ CAS Server 做单点登录,CAS Server 主要是负责认证的,也就是它主要解决登录问题。登录成功之后,还有⼀个权限处理的问题,权限的问题则交由各个 CAS Client ⾃⾏处理,并不在 CAS Server 中完成。
在上篇⽂章中,松哥有教过⼤家定义 UserDetailsService,不知道⼤家是否还记得如下代码(忘记了可以参考上篇⽂章:Spring Boot 实现单点登录的第三种⽅案!):
@Component@Primarypublic class UserDetailsServiceImpl implements UserDetailsService{ @Override public UserDetails loadUserByUsername(Strin 这段代码是在什么时候执⾏呢?
如果我们没有使⽤ CAS 这⼀套的话,这段代码当然是在⽤户登录的时候执⾏,⽤户登录时,从数据库中查询⽤户的信息,然后做校验(参考本系列前⾯⽂章就懂)。
如果我们使⽤ CAS 这⼀套,⽤户登录的校验将在 CAS Server 上执⾏,CAS Client 就不⽤做校验⼯作了,但是为什么我们还需要定义UserDetailsService 呢?这是为了当⽤户在 CAS Server 上登录成功之后,拿着⽤户名回到 CAS Client,然后我们再去数据库中根据⽤
户名获取⽤户的详细信息,包括⽤户的⾓⾊等,进⽽在后⾯的鉴权中⽤上⾓⾊。
好了,这是我们⼀个⼤致的思路,接下来我们来看具体实现。
2.具体实现
接下来的配置在 松哥⼿把⼿教你⼊门 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_
2.2 CAS Server
spring教学视频然后我们要在 CAS Server 的 l ⽂件中添加两个依赖:
org.apereo.cas cas-server-support-jdbc-drivers ${cas.version} org.apereo.cas cas-server-support-jdbc ${cas.version}
注意这⾥不⽤添加数据库驱动,系统会⾃动解决。
添加完成之后,再在 src/main/resources/application.properties ⽂件中添加如下配置:
cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/withjpa?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=falsecas.aut
前三⾏配置是数据库基本连接配置,这个⽆需我多说。
第四⾏表⽰配置⽤户查询 sql,根据⽤户名查询出⽤户的所有信息。
第五⾏表⽰数据库中密码的字段名字是什么。
第六⾏是数据库驱动。
OK,配置完成后,接下来我们就来重启 CAS Server:
./build.sh run
此时登录⽤户名就是 javaboy,密码是 123。
2.3 CAS Client
接下来我们再来看看 CAS Client 要做哪些完善。
接下来的配置在 Spring Boot 实现单点登录的第三种⽅案! ⼀⽂的基础上完成,所以还没看前⾯⽂章的⼩伙伴建议先看⼀下哦。
同时,为了案例简洁,我这⾥使⽤ JPA 来操作数据库,要是⼤家不熟悉这块的操作,可以参考本系列之前的⽂章:Spring
Security+Spring Data Jpa 强强联⼿,安全管理只有更简单!。
CAS Client 中的对接主要是实现 UserDetailsService 接⼝。这⾥要⽤到数据库查询,所以我们⾸先添加数据库相关依赖:
mysql mysql-connector-java org.springframework.boot spring-boot-starter-data-jpa
然后在 application.properties 中配置数据库连接信息:
spring.datasource.username=rootspring.datasource.password=123spring.datasource.url=jdbc:mysql:///withjpa?useUnicode=true&characterEncoding=UTF
都是常规配置,我们就不再重复解释了。
接下来我们创建两个实体类,分别表⽰⽤户⾓⾊了⽤户类:
⽤户⾓⾊:
@Entity(name = "t_role")public class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; p
这个实体类⽤来描述⽤户⾓⾊信息,有⾓⾊ id、⾓⾊名称(英⽂、中⽂),@Entity 表⽰这是⼀个实体类,项⽬启动后,将会根据实体类的属性在数据库中⾃动创建⼀个⾓⾊表。
⽤户实体类:
@Entity(name = "t_user")public class User implements UserDetails { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ⽤户实体类主要需要实现 UserDetails 接⼝,并实现接⼝中的⽅法。
这⾥的字段基本都好理解,⼏个特殊的我来稍微说⼀下:
1. accountNonExpired、accountNonLocked、credentialsNonExpired、enabled 这四个属性分别⽤来描述⽤户的状态,表⽰账户
是否没有过期、账户是否没有被锁定、密码是否没有过期、以及账户是否可⽤。
2. roles 属性表⽰⽤户的⾓⾊,User 和 Role 是多对多关系,⽤⼀个 @ManyToMany 注解来描述。
3. getAuthorities ⽅法返回⽤户的⾓⾊信息,我们在这个⽅法中把⾃⼰的 Role 稍微转化⼀下即可。
数据模型准备好之后,我们再来定义⼀个 UserDao:
public interface UserDao extends JpaRepository { User findUserByUsername(String username);}
这⾥的东西很简单,我们只需要继承 JpaRepository 然后提供⼀个根据 username 查询 user 的⽅法即可。如果⼩伙伴们不熟悉 Spring Data Jpa 的操作,可以在后台回复 springboot 获取松哥⼿敲的 Spring Boot 教程,⾥边有 jpa 相关操作,也可以看看松哥录制的视频教程:Spring Boot + Vue 系列视频教程。
在接下来定义 UserService ,如下:
@Component@Primarypublic class UserDetailsServiceImpl implements UserDetailsService{ @Autowired UserDao userDao; @Override public Use
我们⾃⼰定义的 UserDetailsServiceImpl 需要实现 UserDetailsService 接⼝,实现该接⼝,就要实现接⼝中的⽅法,也就是loadUserByUsername。
hello 接⼝访问成功之后,再去访问 /user/hello 接⼝,就会发现权限配置也⽣效了。
这⾥⽐较简单,我就不给⼤家截图了。
3.⼩结
好啦,今天主要和⼩伙伴们分享了⼀下 Spring Security + CAS 单点登录中,如何使⽤本地数据库。⼀个核⼼的思路是,认证由 CAS Server 来做,权限相关的操作,则还是由 Spring Security 来完成。
好啦,⼩伙伴们如果觉得有收获,记得点个在看⿎励下松哥哦~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论