中心认证服务,是指统一提供给内部其它N个应用的认证服务。
具体可参考:https://www.cnblogs.com/lihuidu/p/6495247.html。解释得很形象。
你去某个大学吃饭、看书,需要进他们的食堂、图书馆(这里就类似于app1、app2)
- 你去了食堂,食堂阿姨(app1)告诉你,不收现金。并且告诉你去校服务中心(cas service)去换小票服务中心小姐姐看了它的系统,发现你之前没有到访过本校,于是让你填表(Form登录)当你填表后,服务中心会记录下你的个人凭证(TGT),并给你一张小票(ticket)你拿着小票再去食堂窗口打饭,食堂阿姨看着票,并去问服务中心,票是否是真的,服务中心说是真的你可以打饭吃饭了,并且这一天都可以打饭(cookies)你吃完饭后,想去图书馆自习,图书馆阿姨(app2)也不让进,让你去服务中心服务中心小姐姐看了你的个人凭证(TGT),于是你不用再填表(登录)了,并也给你一张小票你拿着小票再去图书馆,图书馆阿姨联系服务中心后,发现票是真的于是你可以看书了,并且这一天任何时段都可以随意进出看书(cookies)
在项目的代码里面有如下的配置,其中进行单点登录时的cas服务器为xxx,而ticket验证服务器为yyy。
shiro:
casFilterUrlPattern: /shiro-cas
casServerUrlPrefix: xxx
shiroServerUrlPrefix: http://yourtologin.com
casTicketValidatorServerUrlPrefix: yyy
cookieDomain: 'xx.com'
loginUrl: ${shiro.casServerUrlPrefix}/login?service=${shiro.shiroServerUrlPrefix}${shiro.casFilterUrlPattern}
logoutUrl: ${shiro.casServerUrlPrefix}/logout?service=${shiro.shiroServerUrlPrefix}
shiroSessionKeyPre: 'kkk'
shiroSessionExpireSeconds: 3600
globalSessionTimeoutSeconds: 3600
启动项目后,访问http://yourtologin.com。未登录,所以跳转到cas服务器上xxx/login?service=http://yourtologin.com/shiro-cas,展示出登录界面。
输入用户名和密码后,以post请求调用了authentication/authenticate的方法。post请求的数据如下:
{
"mainAuthMethodName": "username-password",
"credential": {
"username": "username",
"password": "xxxxxx",
"encodeVersion": "2"
},
"context": {
"deviceId": "default",
"sign": "default"
},
"version": "2.0",
"accountSystem": "employee",
"service": "http://yourtologin.com/shiro-cas",
"loginTicketId": "xxxxxx"
}
其中credential(凭据)中即包含了用户名和密码(经过加密的,每次不一样)。cas服务器返回的数据包含了ticket。
接着调用项目中的http://yourtologin.com/shiro-cas?ticket=ttt。
项目代码在类PcShiroCasRealm中,其登录认证的逻辑如下:
- 获取到token,其中包含ticket,userId和isRememberMe。此时只有ticket不为空与cas服务器进行ticket的认证认证成功后,获取到principle(用户相关的信息,用户名等)根据用户名去数据库查询用户将token中的userId和isRememberMe设置好将用户信息保存到session中,cookies的设置
认证成功后,进行授权,并展示出首页。
需要注意的是,shiro中涉及到cas的认证和不涉及到cas的认证不一样。对于不涉及到cas的认证,会直接构造好用户密码这样的AuthenticationInfo,而对于cas的认证,构建好的是用户名和ticket,接着扔给cas服务器去认证。



