一、前言
什么是maven的overlay?
overlay可以把多个项目war合并成为一个项目,并且如果项目存在同名文件,那么主项目中的文件将覆盖掉其他项目的同名文件。
apereo提供了一个基于层结构的框架,可以帮助开发者快速引入cas server的代码,然后实现自由配置或代码覆盖,打包方式也非常简单。
Github地址:https://github.com/apereo/cas-overlay-template
二、快速构建
1.环境要求:JDB1.8+
2.下载或者克隆cas-overlay-template(version:5.2.3)项目到本地,用Intellji Idea/Eclipse打开项目,下载依赖时间较长,需耐心等待,建议注释pom文件中配置的repositories,使用国内的镜像.可以换成这个或者阿里云
<repositories>
<repository>
<releases>
<enabled>true</enabled>
</releases>
<id>maven2-release</id>
<url>http://uk.maven.org/maven2/</url>
</repository>
</repositories>
3.有个依赖下载很慢或者下载不了cas-server-webapp-tomcat,建议直接下载之后放到本地仓库对应的目录会快点.进去之后选择5.2.3版本下载.
点击下载cas-server-webapp-tomcat
下载好之后把文件放入到本地仓库中,目录地址为:
$localRepository/org/apereo/cas/cas-server-webapp-tomcat/5.2.3
$localRepository:本地仓库路径
3.在项目中添加src/main/java和src/main/resources目录,并将src/main/java设置为代码文件根目录,将src/main/resources设置为资源文件根目录。
4.将overlays目录下的WEB-INF/classes/目录中的application.properties文件复制到src/main/resources中.相同的文件名,我们项目中的application.properties会把它WAR里面的application.properties覆盖掉.
5.将D:/keys/wolfcode.keystore拷贝到resources目录
6.修改application.properties文件,
- server.ssl.key-store:密钥文件存放位置.classpath:表示在资源目下寻找
- server.ssl.key-store-password:密钥库密码
- server.ssl.key-password:密钥密码
- server.ssl.key-alias:wolfcode 别名
7.打开命令行,进入项目所在目录,运行内置的命令:build.cmd run ,执行时间较长,请耐心等待
8.如果出现如下界面说明CAS Server服务已经启动.
可能中途会出现如下警告,但并不影响运行.
CAS is configured to accept a static list of credentials for authentication. While this is generally useful for demo purposes, it is STRONGLY recommended that
这个只是警告,不是错误,意思是现在使用的是静态的验证,不够安全.
没关系,我们后续会换成数据库的验证.
9.在浏览器中输入https://www.sso.com:8443/cas/login,出现如下界面说明CAS Server服务搭建成功.
注意:www.sso.com是我们自己在host文件中配置的映射,映射到本机127.0.0.1.
默认登陆账号密码是 casuser:Mellon ,可以在application.properties中最后一行修改cas.authn.accept.users=casuser::Mellon
三、搭建JDBC的CAS服务端
1.准备工作
我们需要把用户存储到数据库中,脚本文件cas.sql在
https://github.com/javalanxiongwei/cas-overlay-template-master.
1.创建数据库cas,执行cas.sql文件,执行后拥有了用户表sys_user.
说明:
expired字段表示过期,1表示已过期,需要修改密码
disabled表示账号是否禁用,1表示禁用
数据表存放的数据如下图所示:
说明:
如果采用MD5加密,那password就是MD5加密后的密文,sha同样如此
admin、wolfcode、lanxw明文密码分别是admin、wolfcode、666
2.在POM文件中添加如下依赖:
<!--新增支持jdbc验证-->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>${cas.version}</version>
</dependency>
<!--使用mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
2.配置
需要在配置中告诉框架要哪个数据库的哪个表查询数据,所以在application.properties新增如下配置.
#jdbc验证配置
#Query Database Authentication 数据库查询校验用户名开始
#查询账号密码sql,必须包含密码字段
cas.authn.jdbc.query[0].sql=select * from sys_user where username=?
#指定上面的sql查询字段名(必须)
cas.authn.jdbc.query[0].fieldPassword=password
#指定过期字段,1为过期,若过期需要修改密码
cas.authn.jdbc.query[0].fieldExpired=expired
#为不可用字段段,1为不可用,
cas.authn.jdbc.query[0].fieldDisabled=disabled
#数据库方言hibernate的知识
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect
#数据库驱动
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
#数据库连接
cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=UTF-8
#数据库用户名
cas.authn.jdbc.query[0].user=root
#数据库密码
cas.authn.jdbc.query[0].password=admin
#默认加密策略,通过encodingAlgorithm来指定算法,默认NONE不加密
cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8
cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5
#Query Database Authentication 数据库查询校验用户名结束
#jdbc验证配置
以上配置,如驱动,查询数据库等等需要根据不同的场景进行调整:
- 若密码无加密,调整passwordEncoder.type=NONE
- 若密码加密策略为SHA,调整passwordEncoder.encodingAlgorithm=SHA
- 若算法为自定义,实现org.springframework.security.crypto.password.PasswordEncoder接口,并且把类名配置在passwordEncoder.type
3.测试
在项目所在目录运行build.cmd run,在浏览器输入http://www.sso.com:8443/cas/login.
输入admin/admin
输入wolfcode/wolfcode
输入lanxw/666
4.其他
我们已经把CAS Server端的验证变成使用JDBC的方式认证,而且在数据库中也已经对明文密码使用md5进行加密,但是只是用md5加密安全性不够高.所以一般我们会对密码使用md5+盐加密来增加密码管理的安全性.
我们需要修改application.properties,在配置文件中指定盐值和加密次数:
对应的sys_user_encode的脚本也是从上面的github地址获取.
测试过程和第四点是一致的.
#Encode Database Authentication 开始
#加密次数
cas.authn.jdbc.encode[0].numberOfIterations=2
#该列名的值可替代上面的值,但对密码加密时必须取该值进行处理(如果使用这个配置需要把上面的配置注释)
#cas.authn.jdbc.encode[0].numberOfIterationsFieldName=
# 盐值固定列
cas.authn.jdbc.encode[0].saltFieldName=username
#静态盐值(如果使用这个配置需要把上面的配置注释)
#cas.authn.jdbc.encode[0].staticSalt=.
cas.authn.jdbc.encode[0].sql=select * from sys_user_encode where username=?
#对处理盐值后的算法
cas.authn.jdbc.encode[0].algorithmName=MD5
cas.authn.jdbc.encode[0].passwordFieldName=password
cas.authn.jdbc.encode[0].expiredFieldName=expired
cas.authn.jdbc.encode[0].disabledFieldName=disabled
cas.authn.jdbc.encode[0].url=jdbc:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=UTF-8
cas.authn.jdbc.encode[0].dialect=org.hibernate.dialect.MySQLDialect
cas.authn.jdbc.encode[0].user=root
cas.authn.jdbc.encode[0].password=admin
cas.authn.jdbc.encode[0].driverClass=com.mysql.jdbc.Driver
#Encode Database Authentication 结束
原文链接:
https://www.jianshu.com/p/2bd8f2b1db86
https://www.jianshu.com/p/1e46435ffafa