基于Tomcat 的SSO实现

来源:互联网 发布:海济奖金制度算法 编辑:程序博客网 时间:2024/06/05 02:42
目标:用户Login一次之后,可以访问同一Server上的不同Webapp, 具体实现上采用Tomcat的Single Sign-On实现. 主要分为下面几个步骤:
  • 修改Tomcat conf/server.xml 打开SSO支持
<Host> 节点下增加一个Value节点  <Valve className="org.apache.catalina.authenticator.SingleSignOn"     debug="0" requireReauthentication="false"/></Host>
  • container认证realm: user、role、server.xml的<Realm...>设置.
tomcat的认证机制有2个要素: user 和 role.
    • user 是区别一个个用户的唯一识别了。
    • role 就是一些抽象的权限级别,比如“admin”、“manager”、“member”、“guest”等等,都是可以自己定义的.一个user可以拥有多种role.
“可是tomcat怎么去拿到我的user/role信息呢?我的这些数据都在数据库里阿?” 可以在tomcat的server.xml里用 <Realm> tag来读取这些信息,并且tomcat提供了3、4种现成的Realm实现,其中有从文件里读的,有从JDBC读的,有从DataSource读的,也有从LDAP读的。具体Realm的写法,和提供的几种Realm的配置方法,可以参考tomcat自己的文档,在此不作细述。 (把tomcat自带的webapp: tomcat-docs.war 展开,看里面的 config/realm.html) 如果连这些现成的配置都不能满足你的要求的话,那也可以考虑自己写一个Realm的实现类来满足具体要求。下面举一个JDBC的Realm的配置例子看一下:
<Realm  className="org.apache.catalina.realm.JDBCRealm"  debug="99"  driverName="your.jdbc.driver.here"    connectionURL="your.jdbc.url.here"    connectionName="test"   connectionPassword="test"    userTable="users"     userNameCol="user_name"   userCredCol="user_pass"    userRoleTable="user_roles"   roleNameCol="role_name" />
  • webapp使用SSO:
    • 告诉tomcat这个webapp要通过container的认证
具体做法: 在web.xml里面加上如下的配置:<security-constraint>    <web-resource-collection>        <web-resource-name>Protected Webapp Example</web-resource-name>        <url-pattern>/*</url-pattern>    </web-resource-collection>    <auth-constraint>          <!-- role name 指定哪个role可以访问,可以为多个role -->    <role-name>intrauser</role-name>    </auth-constraint></security-constraint>
    • 选择一种认证方法
在web.xml里面加上如下的配置:<login-config>      <auth-method>BASIC</auth-method>      <realm-name>Intra Web Application</realm-name>  </login-config>  <security-role>      <description>The role that is required to access intrasites</description>      <role-name>intrauser</role-name>  </security-role>
这里有2个要点:
      • auth-method
举例为了简单用了最基本的一种BASIC。若使用BASIC方式,当你去访问受保护认证的资源时,浏览器会弹出一个小窗口让你输入用户名和密码。(就像我们访问ioffice时,第一次弹出来的那个认证窗口)其他还有几种认证方式如:FORM、DIGEST、CLIENT-CERT。其中FORM是可以自己写login画面的,当然html的form内容有些规定(要符合j2ee和container的要求嘛)。 DIGEST是一种加密的传输,而CLIENT-CERT没有查过,有兴趣可以去查一下。
      • realm-name
这个realm-name是这个webapp的认证realm名,注意几个处于同一SSO下的webapp,他们的realm-name要设成一样的值。 如果不设成一样,那么换一个webapp就要重新认证一次,达不到SSO的效果。
    • 如何取得当前的User信息
原本都习惯在login以后,把一些login用户信息放到session里面的. 现在认证都交给container去做了,我们的webapp怎么拿到login用户信息啊? 确实,现在我们的webapp能做的,只有从request里面拿到login用户的userid了。
String userid = request.gerRemoteUser();

以上是在一个Tomcat Container上的SSO实现.
如果是不同的Container上的webapp要做SSO,这种时候一种可行的方案是,最前面架一个webserver(比如apache),在webserver这层承担SSO的认证任务,后面内部就可用挂多个container了. 具体都用到的时候再调查吧.

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 魔域手游账号被冻结怎么办 魔域手游没用的装备怎么办 5173账号三年找回怎么办 电脑的任务栏不见了怎么办 减肥出现瓶颈期怎么办 减肥到瓶颈期怎么办 减脂皮肤松弛怎么办 减肥期间上火了怎么办 涂了瘦身霜好辣怎么办 站起来就头晕怎么办 蹲了起来头晕怎么办 蛙跳后大腿疼怎么办 头低久了脖子痛怎么办 边防武警改革义务兵怎么办 家门钥匙丢了怎么办 森警改革士官怎么办 武警改制后士兵怎么办 消防改革时新兵怎么办 腈纶衣服染色了怎么办 部队新兵体能训练不及格怎么办 做足疗私处有了反应怎么办 跑步跑不起来怎么办 28岁有抬头纹怎么办? 眼睛近视加散光怎么办 眼睛近视又散光怎么办 眼睛近视有散光怎么办 眼睛不近视散光怎么办 孩子眼睛近视散光怎么办 小孩眼睛散光近视怎么办 眼睛近视和散光怎么办 考军校体能不行怎么办 高中体测不及格怎么办 刚开始跑步腿疼怎么办 刚跑步腿酸痛怎么办 小孩走路像鸭子怎么办 走完鸭子步腿疼怎么办 宝宝走路右脚往外撇怎么办 1岁宝宝罗圈腿怎么办 宝宝走路腿弯怎么办 路走多了腿疼怎么办 蛙跳完大腿疼怎么办