之前做过单点登录,方式是通过redis存储token,本地浏览器加载cookie的方式验去redis验证,形式是跨域,如httpclient或者dubbo等方式。但是总感觉这种方式比较小家子气。于是研究了一下shiro的单点登录。
shiro+CAS方式实现单点登录
代码地址:
git@github.com:oulexue/shiro-sso.git
一、环境配置
1.需要使用CAS提供的项目(cas-server中的),下载地址:
http://developer.jasig.org/cas/
版本选3.5.1或者3.5.2均可,建议别太新
解压后的目录,我们需要两个项目:
cas-server-webapp(单点登录系统):
cas-server-support-jdbc:数据库配置模块:配置我们的数据库,加入cas-server-webapp依赖
这两个项目都是源码包(maven版),把它们导入到到eclipse,直接构建
直接运行单点系统(cas-server-webapp)或者打war包,放在tomcat下改名为cas,然后启动访问:http://ip:8080/cas
第一步、MySQL创建数据库和表,(主要是用户表,因为我们主要是研究单点登录)
2.设置数据库和表(使用mysql),主要是用户表,我们只研究单点登录
在cas-server-webapp下添加mysql相关的jar
maven环境如果缺少插件,自行下载(可参考代码中的pom文件,在这里不多说)
修改deployerConfigContext.xml配置文件
首先增加一个datasource,通过增加一下的代码实现:
重启tomcat,就可以用数据库中的用户进行登录了
3.tomcat添加https安全协议
这一步比较重要,如果出错,后面将会出现各种错误
第一步:制作密钥
切换到jdk的bin目录下,执行下面的命令
keytool -genkey -alias tomcat -keystore mykeystore -keyalg RSA -validity 2000
注意:“名字与姓氏”应该是域名(如localhost),输成了姓名,和真正运行的时候域名不符,会出问题
口令随意设置,后面会使用
接着执行导出
keytool -export -alias tomcat -keystore mykeystore -file server.crt
接着再导入到jdk的安全目录下(注意:要导入到jdk下面的jre目录下,不是单独的jre那个目录,我们使用的是jdk7,后面项目因为要使用SSL协议,全部都使用这个jdk)
keytool -import -alias tomcat -file server.crt -keystore e:/java/jdk7/jre/lib/security/cacerts
第二步:配置tomcat服务器
定位到tomcat服务器的安装目录, 找到conf下的server.xml文件
找到如下图位置
取消注释,修改为如下:
注意:keystorefile不是jre/lib下cacerts文件
到此环境搭建完成
二、项目开发
随意找两个我们之前开发的shiro项目,稍加改动,然后进行单点登录测试
一、导入jar
除了shiro相关的jar外,要单独再加一个shiro-cas包
修改spring-shiro.xml配置文件
修改的地方(详情看注释):
shiroDbRealm:casServerUrlPrefix和casService
shiroFilter:loginUrl和filters
casFilter
logoutFilter
casSubjectFactory
securityManager:subjectFactory
相关的路径在shiro.properties
shiro.loginUrl=https://localhost/cas/login?service=http://localhost:8082/shiro-cas
shiro.logoutUrl=https://localhost/cas/logout?service=http://localhost:8082/shiro-cas
shiro.cas.serverUrlPrefix=https://localhost/cas
shiro.cas.service=http://localhost:8082/shiro-cas
shiro.failureUrl=/login
shiro.successUrl=/index
改完后复制一个项目,改改项目名,和发布端口号
两个项目路径分别为:
http://localhost:8081
http://localhost:8082
接下来测试,登录任一系统,跳转至cas系统认证,认证通过后,其他系统无须重新登录。注销任何一个系统。其他系统也会注销,需要再重新登录
演示略
结束