选择、选择、选择:CAS还是OpenID?

来源:Choices, choices, choices: CAS or OpenID?

注:前一段时间研究CAS的Ruby和Python对比时看到的这篇文章。本文并未取得原文作者的授权,只做过个人翻译练习存在。如果有问题,敬请到原站查看。

With RubyCAS and Ruby-OpenID you have two choices to enable authentication for your application.
使用RubyCAS和Ruby-OpenID,你有两个选项可以用来为你的应用程序启用验证部分。

But which choice is the best one? Or rather the correct one? That depends on your usage scenario.
但是哪一个选项是最好的呢?或者说会有一个正确的选项? 这个取决于你使用的场合。

RubyCAS and OpenID solve, roughly, two different problems:
大体上,RubyCAS和OpenID是解决两个不同的问题的:

  • Single Sign On(单点登录)
  • User account management(用户账号管理)

Solving the Single Sign On problem(解决单点登录难题)
This is RubyCAS’ strength. If you want to offer multiple applications to your users (be it on the internet, or in an intranet), RubyCAS is the better choice. Since it allows proxy authentication, users only have to sign into their account once, and all applications available to them can be used without retyping their credentials when switching applications.
这个是RubyCAS的优势。如果你想为你的用户提供多项应用服务的话(在internet或者intranet上) ,RubyCAS是更好的选择。因为它允许代理认证,用户只需要登录他们的账户一次,所有的应用对于他们来说都是可用的,而不用他们在切换应用的时候重新输入他们的认证信息。

This is the classic environment prompting the need for SSO solutions in general, and RubyCAS fits the bill (especially since it provides Authenticators for common enterprisey storage solutions, like LDAP).
在一般的情况下,这是快速适应SSO需求的经典环境,RubyCas正符合这个要求。 (特别是它提供了适合一般企业存储方案的认证工具,比如使用LDAP)。

Simplifying sign up(简化的注册)
This is where OpenID shines. User’s only have to maintain one set of credentials, and can use it whereever they can log in with OpenID. This is a big bonus for you. No need to store passwords, you can automate account creation at the first sign in of your users (you can request account data like passwords, nicknames, first and last names, etc.), and don’t have to worry ( alot) about validation of this data. The user’s OpenID provider took care of that for them.
这是OpenID的闪光点。用户仅需要维护一组登录信息,就可以使用OpenID在任何(支持OpenID)的地方登录了。这对于你来说有更多好处。(整个过程)没有必要保存密码,你可以在你的用户第一次登录的时候自动创建账户(你可以请求账户信息,如密码、昵称、姓名等数据),(一点)也没有必要担心这个数据的验证。用户的OpenID提供者会关注这些。

You can of course offer them an OpenID services with your application, allowing them to use the credentials they use for your application to login everywhere else.
你可以理所当然的与你的应用一起为他们提供 OpenID服务,允许他们使用这些用来使用你的应用登录的信息到其它站点登录。

However, it seems that OpenID doesn’t allow proxy authentication out of the box (you could add it, or maybe the next version will provide support for that, but that is difficult to do in an essentially untrusted network, which leads to things like Kerberos).
然而,看起来OpenID并不允许开箱即用代理认证方式(你可以增加它,或者下一版本会提供它,但是在一个本质上非信任网络中,它导致如同Kerboros的情形)。

So, what should you use?(所以,你该使用哪一个呢?)

If you are user-centric, use RubyCAS. Examples of user-centric scenarios would be Google Apps for Domains: One account for all these services.
如果你是用户为中心的,使用RubyCAS。典型的用户为中心的场合 应该是Google Apps for Domains:一个账户可用于所有的服务。

If you are application-centric use OpenID. Users will only use one or few applications you offer, and you can thusly simplify the process for them, by cutting the amount of username/password credentials your users have to maintain drastically.
如果你是应用为中心的话,你应该使用OpenID。用户会仅使用一个或多个你提供的应用,你就应该以简化用户过程,(比如)采取裁减你的用户必须维护的用户名/密码等登录凭据的方式。

Remember, though, that OpenID is not an ID verification service! If you plan to use OpenID in an intranet, you should have users use an OpenID server you provide on the intranet, and not have them authenticate via, say myopenid.com. This also allows you to fine-tune the data stored with OpenID accounts, for example organizational units, supervisors, etc.
请记住,虽然,OpenID不是一套身份验证的服务!如果你计划在intranet上使用OpenID,那么你应该让你的用户使用你在intranet上提供的OpenID服务器,而不是让他们通过比如:myopenid.com这样的网站认证。这也可以让你微调OpenID账户的数据存储,比如组织机构、主管等信息。

As you can see, there is no single correct answer. Neither RubyCAS nor Ruby-OpenID are silver bullets, solving all your account problems. It is a question of what fits your usage-scenario the best.
就象你了解的那样,这里没有简单正确的答案。无论是RubyCAS还是Ruby-OpenID都不是所谓的“银弹” ,可以解决你关于账户管理的所有难题。它只是个关于哪个更适合你的使用场合更好一些。


说明:CAS的解决方案在独立的企业应用中,即不对外提供开放式服务的时候是一个非常容易布署和实施的方案。比如Server有官方的Java版,还可以使用诸如RubyCAS-Server、django-cas-provider这样的工具或库来自行建立。而且CAS工具集所提供的客户端基本涵盖目前进行B/S开发的语言,比如PHP、Ruby、Python、.NET等。

rubycas-server and rubycas-client demo on Ubuntu

CAS( Central Authentication Service)是由JA-SIG开发的一套开源的单点登录系统,在教育行业有着非常广泛的应用,有不少企业也在使用它。CAS的特点是安全性非常高,可维护性高。感謝Yale大学,名校就是不同。最近要做个单点登录,对比了几个开源产品,比如CAS, JOSSO…。这几天又做了ruby cas和python django cas对比。都很容易。但是ruby的这个居然也象python一样有版本的问题,各种库之间的关系太磨人,实在让我对它大跌眼镜。

版本設定:Ubuntu 10.04缺省安装。注:因为我使用VirtualBox虚拟机,新创建一个比较容易,把安装好的clone一下就可以了。如果没地方还可以用snapshot。

一、安装准备:

安装ruby

gems的版本10.04是1.3.5的,要求1.3.6以上
可按下面的步骤升级:

$ sudo gem install rubygems-update
$ cd /var/lib/gems/1.8/bin/
$ sudo ./rubygems-update
$ gem -v

二、相关软件

先熟悉相关软件吧:RubyCAS
gunark / rubycas-server

gunark / rubycas-client

三、安装配置

根据后面的尝试,确定下面的安装方式可以顺利一些:

$ sudo gem install v=2.1.2 rails
$ sudo gem install picnic
$ sudo gem install rubycas-server

* 我是在rubycas-client的源文件里看到的这个2.1.2,前面走了不少弯路。因为一开始会提醒缺少activesupport,如果缺省安装activespport, activerecord的,会安装gems3的版本。

安装完成执行sudo /usr/bin/rubycas-server,就提醒/etc/rubycas-server/config.yml这个文件不在并生成要你配置了。

配置:

/etc/rubycas-server/config.yml

#服务器配置,如果你象我一样不使用https,注释掉ssl_cert吧。
server: webrick
port: 9000
#数据库配置:
database:
  adapter: mysql
  database: casserver
  username: root
  password: 123456
  host: localhost
#认证程序配置,我使用的是明文的,你可以根据需要使用加密版本
authenticator:
  class: CASServer::Authenticators::SQL
  database:
    adapter: mysql
    database: casserver
    username: root
    password: 123456
    username_column: username
    password_column: password

创建上面提到的数据库。不习惯用mysqladmin -u root create casserver的话安装图形客户端吧。

根据指引,接下来要建立用户表,这个表没有地方说明应该怎样创建,满足什么规范,需要知晓还是自己查代码吧,我只是根据自己的分析随便写的:

create table users
(
  userid int not null auto_increment,
  username varchar(40) not null,
  password varchar(40) not null,
  full_name varchar(50) null,
  access_level int null,
  primary key(userid)
);

忘记了MySQL的auto increment类型写法,参考了这个网站:Create table: auto increment primary key。记得少数参加过的电话面试曾经有人问过cvs的命令,我告之曰我使用的是WinCVS客户端,結果他们很不以为然。有些东西只有天天用才需要记的。难道技能是以不参考任何帮助的情况下才算吗?

再次执行sudo /usr/bin/rubycas-server

访问:http://127.0.0.1:9000/随便输入用户名密码

你可能会遇到下面的错误:

NoMethodError at /login
undefined method `connection_pool' for #<Class:0xb73dfdd0>

Ruby /usr/lib/ruby/gems/1.8/gems/activerecord-2.1.2/lib/active_record/base.rb: in method missing, line 1672
Web POST 127.0.0.1/login

源代码修改:

文件:/usr/lib/ruby/gems/1.8/gmes/rubycas-server-0.7.999999.20100202/lib/casserver/authenticators/
85行

$LOG.debug "#{self.class}: [#{user_mode}] " + "Connection pool size: #{user_model.connection_pool.instance_variable_get(:@checked_out).count)}/#{user_model.connection_pool.instance_variable_get(:@connections).count}"

87行

user_mode.connection_pool.checkin(user_mode.connection)

这两句将导致server端出错,直接注释掉就可以了。这两句话的解决办法参考的居然是解决latex问题的一篇文章,见参考18。

没遇到的话你就庆祝吧,因为大功告成了。

四、rubycas-client配置:

进入rubycas-client/examples/rails目录,修改config/environment.rb文件,:cas_base_url指向正确的路径即可,比如我之前配置的http://127.0.0.1:9000,后面的/不需要。

运行ruby script/server,启动这个RoR程序。

用浏览器访问:http://127.0.0.1:3000/advanced_example/

将导向rubycas-server的认证页面http://127.0.0.1:9000/login?service=http:%3A%2F%2F127.0.0.1%3A3000%2Fadvanced_example&gateway=true,这时输入你在users表里登记的内容,就大功告成了。显示下面的页面:

AdvancedExample#my_account

abc's Account page

Extra Attributes:

[Logout]

五、各程序版本

$ ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]

$ gem -v
1.3.7

最后列一下gems:

$ gem list

*** LOCAL GEMS ***

actionmailer (2.1.2)
actionpack (2.1.2)
activerecord (2.1.2, 2.0.0)
activeresource (2.1.2)
activesupport (2.1.2, 2.0.0)
arel (1.0.1)
builder (2.1.2)
gettext (2.1.0)
i18n (0.4.1)
locale (2.0.5)
markaby (0.7.1)
picnic (0.8.1.20100201)
rack (1.2.1)
rails (2.1.2)
rake (0.8.7)
rubycas-client (2.2.1)
rubycas-server (0.7.999999.20100202)
rubygems-update (1.3.7)
tzinfo (0.3.23)

总结这些,希望能对想要使用ruby做单点登录(SSO)的朋友有所帮助。我喜欢使用的语言少。其实服务器使用JA-SIG的官方版本也是可以的。毕竟CAS算是个协议吧。

有个希望,希望我用完python的时候,这些还没有忘记。

参考文章:

1. ruby on rails 的安装

2. Install Ubuntu Lucid Lynx 10.04 development server with Apache2 + Ruby + Passenger + PHP5 + MySQL + SQLite3 + Imagemagick

3. Install Ruby on Rails – Lucid Lynx

4. rubycas-server文档

5. How can I get RubyGems 1.3.6 on Ubuntu 10.4

gem install rubygems-update
cd /var/lib/gems/1.9.1/bin
sudo ./update_rubygems

6. Cannot run rubycas-server if Rails 3 gems

7. Rails单点登录解决方案CAS

8. Setup JOSSO Agent – Apache 2.2

9. 主题:RubyCAS—–来自ruby世界的一款灵巧的CAS服务器

10. RubyCAS—–来自ruby世界的一款灵巧的CAS服务器

11. http://rubycas-client.rubyforge.org/

12. RubyCAS-Client Readme

13. RapidSSL

14. NameError: uninitialized constant Picnic::Config when trying to run rubycas-server

15. Ubuntu server 10.04安装apache+passenger+ruby+rails+mysql环境

16. rails知名应用和工具

17. Cannot run rubycas-server if Rails 3 gems (activerecord and activesupport) are installed

18. 奇怪的编译错误,请大家帮忙看看

19. 慎用establish_connection

20. RUBYCAS-Server error

21. Rails Development on Ubuntu 10.04

22. Java版本的CAS服务器搭建

23. CAS项目实践

24. 用 Ruby 脚本在 Project_Zero 平台上构建 Restful 应用

25.