上篇使用默认的用户名密码登录 casuser/Mellon 登录cas。我们可以通过etc/cas/config/cas.properties 配置不同的后端存储用来进行用户信息的authentication的校验。
这里使用MongoDB作为用户信息认证的后端存储,参考这里官方文档:https://apereo.github.io/cas/6.5.x/authentication/MongoDb-Authentication.html。 主要是三个步骤,但需要先把 cas-server-support-mongo 加到build.gradle文件。
代码语言:javascript复制implementation "org.apereo.cas:cas-server-support-mongo"
1)在MongoDb中保存用户信息
获得密码’md5password’的MD5值,并保存到collection。 $ md5 -s ‘md5password’ MD5 (“md5password”) = ec85070aa70e598eda72cbe82d99fabc
代码语言:javascript复制db.cas_user.insert({
"username": "casuser",
"password": "ec85070aa70e598eda72cbe82d99fabc",
"first_name": "john",
"last_name": "smith"
})
2) 配置cas从MongoDB获取用户信息
通过直接设置client-uri表明连接到mongoDB的哪个库做认证,就不用再分别设置注入host、database这样的参数了。
cas-user
是保存用户数据的collection。
如果因为我们使用MD5作为密码摘要来验证,所以这里password-encoder.type 设置为 DEFAULT,encoding-algorithm设置为MD5。可以查看源码 DefaultPasswordEncoder 理解这个设置,诸如BCrypt是不需要encoding-algorithm的。
cas也支持BCRYPT、PBKDF2这样的密码编码。也可以把type设置为一个自己实现的PasswordEncoder。
如果密码是明文保存的,则可把 password-encoder.type 设为NONE。
# -- Use MongoDB as the authentication data source.
cas.authn.mongo.client-uri=mongodb://admin:password@localhost:27017/cas_db
cas.authn.mongo.collection=casdb_user
# cas.authn.mongo.database-name=
# cas.authn.mongo.host=localhost=
# cas.authn.mongo.password=
# cas.authn.mongo.port=27017
# cas.authn.mongo.principal-transformation.groovy.location=
# cas.authn.mongo.user-id=
cas.authn.mongo.password-encoder.type=DEFAULT
cas.authn.mongo.password-encoder.encoding-algorithm=MD5
3)登录验证
运行./gradlew clean copyCasConfiguration build run
,在浏览器输入casuser / md5password 进行登录。
4)使用BCrypt
BCrypt是当前最通用的password encoding方式了。BCrypt会自己内部产生一个随机salt并和hash的结果保存在一起作为encode的结果。这样每次做BCrypt的结果都不同并且再校验时也无需提供salt。可参考这篇文章spring-security-registration-password-encoding-bcrypt。
生成一个密码bcpassword的BCrypt值:
代码语言:javascript复制$ brew tap spring-io/tap
$ brew install spring-boot
$ spring encodepassword bcpassword
{bcrypt}$2a$10$fJc2wH.Oc1SES8Ju/fCoFOjqs6CRnIgPAbUXqRJQ.DGnBVTGG.bLy
更新数据库里的password为2a10
设置 cas.authn.mongo.password-encoder.type=BCRYPT 注释掉 cas.authn.mongo.password-encoder.encoding-algorithm。
使用新代码和配置运行CAS Server:
代码语言:javascript复制./gradlew clean copyCasConfiguration build run
用密码bcpassword登录。
这个时候cas后台就已经使用BCrypt来验证密码了。其实Type=BCRYPT就对应到了class org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder。