1.前言
最近在写一个前后端分离的项目需要使用到学校的统一认证系统,由于后端使用的是Spring Boot,于是想到了整合一下Spring Security cas来实现单点登录,在这个过程中遇到了一些问题,在这里记录一下。
2. 问题
2.1 使用第三方的统一认证系统获取到的信息
首先是查看一下第三方统一认证页面中的html表单元素
可以看到虽然是非常古老的认证系统了,但是用户名和密码还是很规矩地使用的username和password(因为我们这里username填入的是卡号,一开始觉得这里可能不是username而是什么studentId之类的东西),但是实际查看之后发现还是很老实地使用了username,那就很好办了,后端整合cas的时候可以直接使用已经固定username字段来获取到这个信息,基本上不用做任何的修改。
public class CustomUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {...}
也就是说我们自定义的UserDetailService实现类中的loadUserByUsername这个方法,可以直接放心地获取username,这里方法参数中获取到的username就是认证时输入的username信息,或者说就是输入的卡号。所以如果有纠结这类问题的小伙伴可以放心大胆地尝试一下,或者先了解一些cas的一些内部原理再进行设计可能问题就迎刃而解了!
2.2 cas的路由问题
在整合cas的时候,需要指定cas server(或者说统一认证系统)的url,然后Spring Security会在后面拼接上一个service=http://xxx/login/cas的路径,代表的含义就是接下来应该跳转到http://xxx/login/cas的服务路径去,然后就有了一个问题,明明我想要使用的当地的Spring Boot项目中的访问路径是/login而不是/login/cas,但是官方教程中使用的就是/login/cas,所以有样学样使用的就是/login/cas,然后就会发现我们我们这样写之后,最后确实能够成功跳转到/login这里去,那/cas呢?这里是默认设置的,会经过Spring Security的处理,具体过程之后有空看源码再来补上!