046.SpringBoot的单点登陆及权限
SpringBoot和SpringSecurity做WEB应用和权限, 在Jetty下配置jasig(CAS)做单点登陆(SSO)。
@史荣久 / 2015-09-22 / CC-BY-SA-3.0
开发环境
- java version “1.8.0_45”
- jetty 9.3.0.v20150612
- spring-boot 1.2.6.RELEASE
- sprint-security 3.2.8.RELEASE
- Jasig cas 4.1.0
- IDEA IC 14.1.4
- Apache Maven 3.0.5
- Ubuntu 14.04.3 LTS
导入Demo工程
在github上下载 demo-spring-security-cas
。
下载zip或clone全库都可以,工程本身不大。本手册使用的提交是
3b1ee5ecc5e718513127355b884c165bb4936c7f
解压下载的demo-spring-security-cas-master.zip,
在pom.xml中把spring-boot的版本从1.2.1
改为1.2.6
。
以maven工程导入IDEA(社区版足以)。
首次导入时,Maven下载依赖,需要一些时间,耐心等待。
本工程记做demo
以便下文引用。
打包CAS服务
到github上下载Jasig/cas
,建议下载zip,因为全库提交较大。
解压cas-4.1.0.zip,然后进入cas-server-webapp
,
用maven打包 mvn package
。
注意,如果在cas根上打包,要跳过测试,时间漫长且会报错。
mvn -Dmaven.test.skip=true package
经过一些时间的依赖下载,编译,打包过程,最终文件在
target/cas.war
,记做cas.war
以便下文引用。
配置Jetty
新建一个jetty.base,不动jetty.home的执行环境。
# 复制一个jetty.base
cp -r $JETTY_HOME/demo-base jetty
cd jetty
# 清空没用的目录
rm -rf lib resources webapps
mkdir -p lib/ext resources webapps
# 把 cas.war 解压到webaspp,记做`webapps/cas`
unzip ../cas-4.1.0/cas-server-webapp/target/cas.war -d webapps/cas
# 不需要http服务,删掉配置
rm start.d/http.ini
# 启动Jetty,
# 确认 https://127.0.0.1:8443/cas/login
java -jar $JETTY_HOME/start.jar
配置CAS服务
访问 https://127.0.0.1:8443/cas/login 时,提示证书不可信。
其域是jetty.eclipse.org
,须手动信任,并导出证书为jetty.crt
。
然后修改 /etc/hosts
,增加主机和域名映射。
127.0.0.1 jetty.eclipse.org
此时,可以访问 https://jetty.eclipse.org:8443/cas/login
# 导入证书到JRE中,keystore的密码是 changeit
keytool -import \
-keystore $JAVA_HOME/jre/lib/security/cacerts \
-file jetty.crt \
-alias jetty.eclipse.org
进入webapps/cas
,添加新用户。
修改 WEB-INF/deployerConfigContext.xml
在109行,即AcceptUsersAuthenticationHandler
标签中,
追加<entry key="admin" value="admin"/>
。
追加本地service,进入/WEB-INF/classes/services/
。
复制一份,或直接修改都可以。这里简单修改Apereo-10000002.json
,
把”serviceId”的值变为”^http.*”
重启jetty。
配置Demo工程
在IDEA中修改demo工程的src/main/resources/application.properties
,
替换cas.service.*
的value从test.cas.ent
到jetty.eclipse.org:8443
。
修改pom.xml 把 tomcat
相关的provided
注释掉,否则要部署tomcat运行。
以JavaApp 运行 /src/main/java/org/esco/demo/ssc/Application.java
访问 http://localhost:8080/ ,并以admin/admin登陆,可以看到demo功能了。
遇到问题
证书错误,导入证书到JRE即可。
javax.net.ssl.SSLHandshakeException:
java.security.cert.CertificateException:
No subject alternative names present
服务未授权,增加或修改/WEB-INF/classes/services/*.json
Application Not Authorized to Use CAS
The application you attempted to authenticate
to is not authorized to use CAS.
http://localhost:8080/filtered 时403错误,以admin用户登陆即可。
type=Forbidden, status=403
principal=casuser, type=AUTHORIZATION_FAILURE,
data={....AccessDeniedException,
message=Access is denied}]
最后别忘了在/etc/hosts
中却掉jetty.eclipse.org
的映射。
参考资料
- spring-boot是什么,阿福博客
- spring-boot,官网
- spring-security,官网
- demo-spring-security-cas,github
- Jasig cas,github
- Jasig 常见问题,官网
- CAS单点登录(SSO)完整教程,博客
- Jetty,官网