新手问题 Rubycas-server 登录修改 [自力更生,搞定,封贴]

lionzixuanyuan · 2013年03月05日 · 最后由 lionzixuanyuan 回复于 2014年08月11日 · 3676 次阅读

问一个小白问题 今天在折腾rubycas-server,实现了单点登录功能。 但是在密码一栏里需要输入数据库中保存的密文才能登录成功。 想要问问在哪个文件里修改才能实现将明文转化为密文后,再进行登录的验证。 看了很多遍代码,可能是自己能力有限,没能找到修改方法,问题比较低级,大家误见笑~ rubycas的版本是1.1.2

共收到 17 条回复

@lionzixuanyuan 能麻烦讲一下明文密码是怎么回事吗?网上都是一些初级文章,教大家用明文密码测试登录

https://code.google.com/p/rubycas-server/wiki/UsingTheSQLEncryptedAuthenticator 在这找到这句: class: CASServer::Authenticators::SQLEncrypted

文档里只有这句: class: CASServer::Authenticators::SQL

#2楼 @Peter 呃,我是这么去理解这个事情的。 首先,用户的密码的作用就是校验使用个密码的人是否为真正知道这个密码的那个人。而校验的过程就是提交一个密码与数据库中保存的密码相互比较,看是否匹配。那么最简单的,数据库中保存的密码为:123,提交的内容为:123,匹配通过。 但是这样是不安全的,不论通过何种方式,数据一旦泄漏,那么,用户的密码就也随之泄漏。所以,我们就要考虑使用加密。 在数据库中保存密码密文,而用户提交密码明文,通过加密算法,将用户提交的密码明文转换成密码密文,再与数据库中的密码密文匹配。在这种情况下,数据泄漏后,得到数据的人看到的是密文,在一定程度上可以降低密码泄漏的风险。但仍然不是最理想的方式,因为加密算法在概念上是有加密算法和解密算法两个流程,这两个流程是互逆的。即,如果得到数据库的人,碰巧也能通过一定的方法破解你的加密方式,并实现了与之对应的解密算法,那么,他得到的密文其实也就相当于明文了。 所以,下面就要介绍一下摘要算法,摘要算法与加密算法最大的区别就是不可逆,即无法通过密文得到与之对应的明文。那么,在当密文泄漏后,无法通过完成一个解密算法来进行逆运算。只有通过暴力破解,就是用大量的排列组合去通过摘要算法得到密文后再去匹配,这个工作量几乎是无法估量的。目前著名的摘要算法有RSA公司的MD5算法和SHA-1算法及其大量的变体。但是MD5算法前几年貌似被中国的一个女学者破解了,那是我大学时候的事情,已经记不太清楚了。 以上,都是个人理解,你将就这看看吧~

#3楼 @lionzixuanyuan 谢谢你的耐心科普。

我还想问一下,你的系统最后是怎么做的呢?是不是在 config.yml 里面用的这句: class: CASServer::Authenticators::SQLEncrypted

#4楼 @Peter 对的,其实就是你贴的那个网页里的方法,你现在什么问题导致校验不正确?。。。我问得是废话,知道问题所在一般都能解决问题了

#4楼 @Peter 你留意下这个地方,进行摘要的字符串可能不对,我当时这块是出错了的

#6楼 @lionzixuanyuan 谢谢,我发第一帖的时候是因为没找到相关文章,他们搬去github后,wiki里面就好像没有提SQLEncrypted了。

我觉得 RubyCAS 无论如何也不应该提供明文保存密码的方式

后来我找到文章后,就想跟你确认一下,你是不是也是用的这个方法。网上介绍 RubyCAS 的好像不多啊,他们官方文档介绍也不全面。

#7楼 @Peter 呃,他那个 config.ymal.example 里的注释中写的还是比较清楚的,我当时是没仔细看

我也没细看,但我觉得 RubyCAS 无论如何也不应该提供明文保存密码的方式,在Wiki里面这么介绍,说不定真有人这么用,如果让程序员能看到别人的常用密码,这不是引诱人犯罪吗?

@lionzixuanyuan 又来打扰你一下,

Rubycas-server 只搞定了三件事情,对数据库是只读操作 login_url = "https://cas.myorganization.com/login" logout_url = "https://cas.myorganization.com/logout" validate_url = "https://cas.myorganization.com/serviceValidate"

那用户注册,忘记密码,邮件验证之类的功能是不是要自己另外写个 Rails 程序来搞定?而且这个 Rails 要和 Rubycas-server 共用一个数据库,实现用户信息的写操作?

不知道直接用 Devise 是不是就可以搞定了,你是怎么做的呢?

#11楼 @Peter 赞,多谢分享,有机会的时候我尝试下这个

#12楼 @lionzixuanyuan 请教一下,你是不是自己另外写个 Rails 程序来搞定用户注册,忘记密码,邮件验证之类的功能?有没有可能给我一份代码呢,谢谢!

#13楼 @Peter 我已经从原来那个公司离职了,代码没办法给到的,况且从现在回头看那份代码,其实写的是相当糟糕的,再者,那是ruby 1.8.7(貌似,既不清楚了,反正很老)给你估计也用不上。 然后,这些功能其实不难的: 用户注册就理解成用户新建; 忘记密码就是往用户注册的邮箱发一封包含重置密码的页面URL的邮件,这个URL结尾带一个参数,一般时随机生成的,然后通过cache临时存储的; 验证的话,就通过那个随机参数与系统中的cache去匹配,能匹配到就表示当前链接有效,然后删除cache就好了,然后做个表单提交新的密码就好了。

谢谢回复,知道你是自己写的就很有帮助了,至少我方向没错。网上也没有参考代码,下面的这种逻辑如果没有人做过,我猛然下手,怕走弯路,所以才多次麻烦你:

如果一个用户 Tom 在 A.com 注册,那用户名 Tom 应该记录在 A.com 的用户表中,同时要把用户名 Tom 和对应的密码保存在 Rubycas-server。

如果还有一个网站 B.com,那 Tom 在登录 B.com 的时候,B 系统的用户表还没有 Tom,那就应该从 Rubycas-server 得到了 Tom 的用户名,然后写入 B.com 的用户表

rubycas-server中不保存任何用户数据的,它只是读取A.com的数据库,判断用户的登录行为是否合法; B.com中没有用户数据,也无法从rubycas-server中获取用户数据,所以,B.com从rubycas-server中得知用户登录成功,并且在自己用户表中没有检索到对因的用户信息,那么B.com应该为这个用户新建一个B.com中的账户,然后让用户自己去完善这个账户。你可以参考下许多支持qq登录的论坛网站的做法

#15楼 @Peterrubycas-server中不保存任何用户数据的,它只是读取A.com的数据库,判断用户的登录行为是否合法; B.com中没有用户数据,也无法从rubycas-server中获取用户数据,所以,B.com从rubycas-server中得知用户登录成功,并且在自己用户表中没有检索到对因的用户信息,那么B.com应该为这个用户新建一个B.com中的账户,然后让用户自己去完善这个账户。你可以参考下许多支持qq登录的论坛网站的做法

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册