服务器

位置:IT落伍者 >> 服务器 >> 浏览文章

用Tomcat的SSO实现


发布日期:2019年11月03日
 
用Tomcat的SSO实现

目标:用户Login一次之后可以访问同一Server上的不同Webapp 具体实现上采用Tomcat的Single SignOn实现 主要分为下面几个步骤:

修改Tomcat conf/serverxml 打开SSO支持

<Host> 节点下增加一个Value节点

<Valve className=orgapachecatalinaauthenticatorSingleSignOn

debug= requireReauthentication=false/>

</Host>container认证realm userroleserverxml的<Realm>设置

tomcat的认证机制有个要素 user 和 role

user 是区别一个个用户的唯一识别了

role 就是一些抽象的权限级别比如adminmanagermemberguest等等都是可以自己定义的一个user可以拥有多种role

可是tomcat怎么去拿到我的user/role信息呢?我的这些数据都在数据库里阿? 可以在tomcat的serverxml里用 <Realm> tag来读取这些信息并且tomcat提供了种现成的Realm实现其中有从文件里读的有从JDBC读的有从DataSource读的也有从LDAP读的具体Realm的写法和提供的几种Realm的配置方法可以参考tomcat自己的文档在此不作细述 (把tomcat自带的webapp: tomcatdocswar 展开看里面的 config/l) 如果连这些现成的配置都不能满足你的要求的话那也可以考虑自己写一个Realm的实现类来满足具体要求下面举一个JDBC的Realm的配置例子看一下

<Realm className=orgapachecatalinarealmJDBCRealm debug=

driverName=yourjdbcdriverhere

connectionURL=yourjdbcurlhere

connectionName=test

connectionPassword=test

userTable=users

userNameCol=user_name

userCredCol=user_pass

userRoleTable=user_roles

roleNameCol=role_name />webapp使用SSO

告诉tomcat这个webapp要通过container的认证

目标:用户Login一次之后可以访问同一Server上的不同Webapp 具体实现上采用Tomcat的Single SignOn实现 主要分为下面几个步骤:

修改Tomcat conf/serverxml 打开SSO支持

<Host> 节点下增加一个Value节点

<Valve className=orgapachecatalinaauthenticatorSingleSignOn

debug= requireReauthentication=false/>

</Host>container认证realm userroleserverxml的<Realm>设置

tomcat的认证机制有个要素 user 和 role

user 是区别一个个用户的唯一识别了

role 就是一些抽象的权限级别比如adminmanagermemberguest等等都是可以自己定义的一个user可以拥有多种role

可是tomcat怎么去拿到我的user/role信息呢?我的这些数据都在数据库里阿? 可以在tomcat的serverxml里用 <Realm> tag来读取这些信息并且tomcat提供了种现成的Realm实现其中有从文件里读的有从JDBC读的有从DataSource读的也有从LDAP读的具体Realm的写法和提供的几种Realm的配置方法可以参考tomcat自己的文档在此不作细述 (把tomcat自带的webapp: tomcatdocswar 展开看里面的 config/l) 如果连这些现成的配置都不能满足你的要求的话那也可以考虑自己写一个Realm的实现类来满足具体要求下面举一个JDBC的Realm的配置例子看一下

<Realm className=orgapachecatalinarealmJDBCRealm debug=

driverName=yourjdbcdriverhere

connectionURL=yourjdbcurlhere

connectionName=test

connectionPassword=test

userTable=users

userNameCol=user_name

userCredCol=user_pass

userRoleTable=user_roles

roleNameCol=role_name />webapp使用SSO

告诉tomcat这个webapp要通过container的认证

具体做法 在webxml里面加上如下的配置

<securityconstraint>

<webresourcecollection>

<webresourcename>btBT下载 </webresourcename>

<urlpattern>/*</urlpattern>

</webresourcecollection>

<authconstraint>

<! role name 指定哪个role可以访问可以为多个role

<rolename>intrauser</rolename>

</authconstraint>

</securityconstraint>选择一种认证方法

在webxml里面加上如下的配置

<loginconfig>

<authmethod>BASIC</authmethod>

<realmname>Intra Web Application</realmname>

</loginconfig>

<securityrole>

<description>The role that is required to access intrasites</description>

<rolename>intrauser</rolename>

</securityrole>这里有个要点

authmethod

举例为了简单用了最基本的一种BASIC若使用BASIC方式当你去访问受保护认证的资源时浏览器会弹出一个小窗口让你输入用户名和密码(就像我们访问ioffice时第一次弹出来的那个认证窗口)其他还有几种认证方式如FORMDIGESTCLIENTCERT其中FORM是可以自己写login画面的当然html的form内容有些规定(要符合jee和container的要求嘛) DIGEST是一种加密的传输而CLIENTCERT没有查过有兴趣可以去查一下

realmname

这个realmname是这个webapp的认证realm名注意几个处于同一SSO下的webapp他们的realmname要设成一样的值 如果不设成一样那么换一个webapp就要重新认证一次达不到SSO的效果

如何取得当前的User信息

原本都习惯在login以后把一些login用户信息放到session里面的 现在认证都交给container去做了我们的webapp怎么拿到login用户信息啊? 确实现在我们的webapp能做的只有从request里面拿到login用户的userid了

String userid = requestgerRemoteUser();

以上是在一个Tomcat Container上的SSO实现

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

上一篇:Redhat 下安装 Tomcat 之完全指南

下一篇:解决subclipse通过http proxy访问subversion服务器的问题