论坛首页 综合技术论坛

关于CAS实现单点登录的思考

浏览 22447 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2011-04-19   最后修改:2011-05-06

      公司要做一个包括很多应用的系统,要实现单点登录,现在所有的应用都还没有做好,在做架构,我负责单点登录。

      于是研究了两天CAS,对用户注册这个问题很纠结,有以下两种方式,不知哪个更好,期待大家讨论。

 

      1、Server端有DB,自己做好用户注册的实现,将接口提供给各个Client端(具体用什么方式让Client端调用是个难点,难点1)。

       这样的话,用户登录某一应用(CAS中的Client端)时,会被拦截,转到Server端,在Server端读数据库进行验证,验证通过后,返回到Client端,然后Client端再读自己的数据库,取出用户的信息(此处很纠结,因为各个Client的用户实体的属性是不一样的,比如有的Client端的用户有手机号这一属性,有的则没有,所以综合了一下,只希望在Server端存用户的用户名和密码)。

 

      2、Server端无DB,注册时到各Client端只把用户信息保存到各自的DB。

      这样的话,用户登录某一应用(CAS中的Client端)时,会被拦截,转到Server端,Server端根据请求的不同判断该调用哪个Client的DB进行验证(难点2),此处又要有分支了:

      1)、验证的时候把用户信息读出来,验证通过后,将用户信息直接传给Client端(难点3),这样Client端就不用再读DB提取用户信息了。

      2)、验证的时候不读用户的信息,验证通过后,返回到Client端,Client端再读用户信息。

 

大家觉的用什么方式好一些?并希望大家对标红的三个难点进行讨论。

 

 

这个帖子不错:http://www.iteye.com/topic/165313

 

BTW:

感谢大家的热情参与,特别鸣谢:wad12302、denger 、fallen_lord、lovit

大家可以看一下他们的发帖,会得到不少信息。

扩展CAS等具体做法请参照fallen_lord的发帖。

稍后我会参照他们的观点作出整理,loading..........

 

-----------------------------------分割线-----------------------------------------------------

 

现在正在实现着,等实现好了再把方案完整的贴出来。

采用的方式是REST,谢谢denger的建议,至于CAS怎么集成REST,大家可以去看denger博客上的文章:http://denger.iteye.com/blog/973068

 

loading...........

 

   发表时间:2011-04-21  
我也想问下:

那么现在 server端进行验证的时候 怎么判断用户的信息 ??
server这边怎么获取用户信息??

直接连接client 的数据库吗 还是怎么的??


是否需要一个 共享的 用户信息保存中心?
0 请登录后投票
   发表时间:2011-04-22  
wad12302 写道
我也想问下:

那么现在 server端进行验证的时候 怎么判断用户的信息 ??
server这边怎么获取用户信息??

直接连接client 的数据库吗 还是怎么的??


是否需要一个 共享的 用户信息保存中心?


直接连Client数据库。
如果你有一个以上的Client,那么就把这些Client的数据库信息都配置到Server端,验证的时候Server端会根据你配置的Client的数据库信息去读Client的数据库,如果其中任何一个通过了就算通过了。

不需要共享的用户信息保存中心。

PS:
CAS只提供验证、退出等功能,不提供注册等功能。
0 请登录后投票
   发表时间:2011-04-22  
这个了解。

主要是现在 想了解怎么 分配注册这个问题:

比如我有多个系统进行合并,并且每个系统 都有自己的用户信息存储表

系统A   a_user

系统B   b_user

那么 现在我使用单点登录时候 怎么判断查询那个 表的用户信息好,有什么策略没有。

应为cas 提供验证,但是登录时候 用户名和密码最终是用哪里的?
0 请登录后投票
   发表时间:2011-04-23  
wad12302 写道
这个了解。

主要是现在 想了解怎么 分配注册这个问题:

比如我有多个系统进行合并,并且每个系统 都有自己的用户信息存储表

系统A   a_user

系统B   b_user

那么 现在我使用单点登录时候 怎么判断查询那个 表的用户信息好,有什么策略没有。

应为cas 提供验证,但是登录时候 用户名和密码最终是用哪里的?


从你问的这些问题看,你根本就没深入了解一下CAS,建议多上网上查查,另外,我文中最后的那个链接挺不错的,仔细看完了估计你就了解的差不多了。

对于你的问题:

找到deployerConfigContext.xml这个文件,在beans标签的下面加上以下两个数据源(注意,所加的这两个数据源必须是beans下面的第一个bean):
<bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
       <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
       <property name="url"><value>jdbc:mysql://192.168.1.244:3306/cas</value></property>
       <property name="username"><value>root</value></property>
       <property name="password"><value>root</value></property>
	</bean>
	<bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
       <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
       <property name="url"><value>jdbc:mysql://192.168.1.245:3306/cas1</value></property>
       <property name="username"><value>root</value></property>
       <property name="password"><value>root</value></property>
	</bean>


然后找到:
<bean
					class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

把他注释掉,加上以下两个:
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
				        <property name="sql" value="select password from a_user where username=?" />
				      <property name="dataSource" ref="dataSource1" />
				</bean>
		        <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
				        <property name="sql" value="select password from b_user where username=?" />
				      <property name="dataSource" ref="dataSource2" />
				</bean>

修改成这样就可以了。

然后:

假如a_user中有一个用户:auser,b_user中有一个用户buser,这样你无论用哪一个用户登录,CAS就会先查a_user,如果用户名密码都正确,那么就通过,如果a_user中验证失败,那么CAS就会再查b_user,用户名密码都正确就算通过了,此时不正确,就算这次登录验证没通过。

如果现在还不知道怎么回事,那我就哭了。。。。。
另外,千万不要成为伸手党,自己查资料才是王道。
0 请登录后投票
   发表时间:2011-04-25   最后修改:2011-04-25
我个人觉得 选1...
理由是...你的server是个用户中心.他提供向外服务..
所有的系统依赖于他,而对于依赖他的Client端特有的属性,比如手机,如果不是大家都需要,就放在Client处, Client端也有个数据库,每天同步即可,或者有修改即使广播更新

我感觉方案2就像层皮,,不是真真意义上的用户中心了..
如果用户信息需要同步..你的广播源用谁了?逻辑上不是很合适吧



0 请登录后投票
   发表时间:2011-04-25  
单点登录,最基本的用户数据还是要存储在server端
否则,单点登录就失去意义:不同的应用有不同的账号,你怎么实现漫游?
0 请登录后投票
   发表时间:2011-04-25  

就我的使用cas来说,用户信息肯定要统一起来

各个client如果都有自己的用户数据库那么就失去用户信息的意义了

这些其实相当于一个普通的用户相关信息

真正的用户名密码都只有一套

0 请登录后投票
   发表时间:2011-04-25   最后修改:2011-04-25
谢谢!

其实针对多个用户信息不同表情况 只是限于 继承原有系统,如果新系统 可能都会采取多个系统共用一个用户信息(只针对于企业应用系统)


还有一点就是对于多数据源问题,这个对于认证时候可以选择:

但是我主要是想表达另一个问题是:用户信息问题(也只是企业应用,基于原有系统集成)
系统A   a_user

系统B   b_user


当用户A单点登录到B系统时候 那么B系统对A用户的权限验证问题(B系统中没有A的用户信息,是否需要数据同步),

通过2个数据源链式访问验证用户,那么过后对于 一些操作(读取,删除)权限的验证 有没有什么好的策略进行延伸


也许这个问题已经不是单点登录问题??

主要想知道有什么好的机制
0 请登录后投票
   发表时间:2011-04-25   最后修改:2011-04-25
用一个LDAP服务器,如Active Directory来集中管理用户信息。CAS跟LDAP结合进行身份验证,各个应用自己维护各自的用户信息。当然这会涉及到各个应用与LDAP服务器之间用户信息同步的问题。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics