关于CAS实现单点登录的思考
?? ? ?公司要做一个包括很多应用的系统,要实现单点登录,现在所有的应用都还没有做好,在做架构,我负责单点登录。
?? ? ?于是研究了两天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...........
?
<bean id="dataSource1" 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" 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/>
<bean value="select password from a_user where username=?" /> <property name="dataSource" ref="dataSource1" /></bean> <bean value="select password from b_user where username=?" /> <property name="dataSource" ref="dataSource2" /></bean>
<bean value="select password from a_user where username=?" /> <property name="dataSource" ref="dataSource1" />[color=red][size=x-large]<property ref="passwordEncoder" name="passwordEncoder"/>[/size][/color]</bean> <bean value="select password from b_user where username=?" />[color=red][size=x-large]<property ref="passwordEncoder" name="passwordEncoder"/>[/size][/color] <property name="dataSource" ref="dataSource2" /></bean>