③拳两脚▼ 2015▼ spring sso cas jetty security

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.entjetty.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的映射。

参考资料

《046.SpringBoot的单点登陆及权限》 SpringBoot和SpringSecurity做WEB应用和权限,在Jetty下配置jasig(CAS)做单点登陆(SSO)。
题图:《全党全民为生产1070万吨钢而奋斗》于1958年8月17日通过,从此掀起轰轰烈烈的全民大炼钢铁运动。