回顾
成都创新互联公司网站建设提供从项目策划、软件开发,软件安全维护、网站优化(SEO)、网站分析、效果评估等整套的建站服务,主营业务为成都网站设计、网站制作,App定制开发以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。成都创新互联公司深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
在前几天,我使用apache+tomcat搭建了一个集群,有一个简单的网站应用。http://my.oschina.net/xpbug/blog/197680。
今天在此基础上,我要为其开发一个登录页面,并开启网站的认证和授权。
基本概念
在动手之前,我需要先了解网站认证和授权的几个基本组成部分的概念。是什么构成了网站应用的认证和授权?
以上1,2,5是由网站管理员来配置开发。3,4是由网站开发人员来配置和开发的。
本实验简介
在前篇实验结果的基础上,为网站开启ldap认证,并制作一个login页面。实验所用的ldap软件为开源的openLDAP for windows版本。
OpenLDAP安装配置
- database bdb
- suffix "dc=mycompany,dc=com"
- rootdn "cn=admin,dc=mycompany,dc=com"
- rootpw admin
- # Define top-level entry
- dn: dc=mycompany,dc=com
- objectClass: dcObject
- objectClass: organization
- o: mycompany
- dc:mycompany
- # Define an entry to contain people
- # searches for users are based on this entry
- dn: ou=people,dc=mycompany,dc=com
- objectClass: organizationalUnit
- ou: people
- # Define a user entry
- dn: uid=jjones,ou=people,dc=mycompany,dc=com
- objectClass: inetOrgPerson
- uid: jjones
- sn: jones
- cn: janet jones
- mail: j.jones@mycompany.com
- userPassword: janet
- # Define a user entry for Fred Bloggs
- dn: uid=fbloggs,ou=people,dc=mycompany,dc=com
- objectClass: inetOrgPerson
- uid: fbloggs
- sn: bloggs
- cn: fred bloggs
- mail: f.bloggs@mycompany.com
- userPassword: fred
- # Define an entry to contain LDAP groups
- # searches for roles are based on this entry
- dn: ou=groups,dc=mycompany,dc=com
- objectClass: organizationalUnit
- ou: groups
- # Define an entry for the "red" role
- dn: cn=red,ou=groups,dc=mycompany,dc=com
- objectClass: groupOfUniqueNames
- cn: red
- uniqueMember: uid=jjones,ou=people,dc=mycompany,dc=com
- uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com
- # Define an entry for the "black" role
- dn: cn=black,ou=groups,dc=mycompany,dc=com
- objectClass: groupOfUniqueNames
- cn: black
- uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com
运行命令 slapadd.exe -l my.ldif
验证条目添加成功,运行查询命令 ldapsearch.exe -x -b "dc=mycompany,dc=com" "objectClass=*"
OpenLDAP安装配置成功,我有了下面两个用户:
|
|
|
|
|
|
|
|
#p#
为Tomcat配置Realm
tomcat的realm可以配置在server.xml中的
- connectionName="cn=admin,dc=mycompany,dc=com"
- connectionPassword="admin"
- connectionURL="ldap://localhost:389"
- userPassword="userPassword"
- userPattern="uid={0},ou=people,dc=mycompany,dc=com"
- roleBase="ou=groups,dc=mycompany,dc=com"
- roleName="cn"
- roleSearch="(uniqueMember={0})"
- />
重启tomcat集群。
为Web应用配置Basic Authentication
我要为https://www.test0.com/sessiontest/successful.jsp配置BA,只有role=red才可以访问此页面。
修改web应用的web.xml,添加如下代码:
result /successful.jsp red BASIC tomcat red black
然后重新打包部署sessiontest.war. 对网站进行测试,select.jsp是可以任意访问的,当点击submit以后,必须对浏览器弹出的BA认证框输入用户名和密码才能post成功。
为Web应用配置Form-based Authentication
这次,我们要设计一个登录页面。用户可以随意浏览购物车,选择想要的东西,但当用户点击submit的时候,我们需要用户必须登录,才能提交订单。所以,我们需要对页面https://www.test0.com/sessiontest/successful.jsp进行FBA保护。
首先设计一个登录页面login.html
- Username
- Password
注意form中的action已经user和password的input的name属 性,“j_security_check","j_username"和"j_password"这些事固定的,严格遵循J2EE规范。将 login.html放入select.jsp同级目录下。
关于logout,我就不做设计了,很简单,只需要执行session.invalidate(),然后跳转到登出页面即可。
接下来,我们修改web.xml,配置FBA. 这里只需要替换之前BA中的的
FORM /login.html /login.html
将web应用重新打包部署。重启tomcat。
注意:使用mod_proxy_balancer +mod_ajp+ AJP的方式连接tomcat,存在着一个未知错误。当用户没有登录,访问被保护资源的时候,按照常理,浏览器会显示我们配置好的login form。但AJP和tomcat之间的通信会在此断掉。这可能是windows版本的问题,也可能是mod_ajp和tomcat存在缺陷。总之,花了 一天的时间,也没研究出成果。google上面类似的问题挺多,可惜都没答案。我会开启tomcat的log再仔细研究到底发生了什么。
根据以往老版本,大部分使用mod_jk+ajp的方式行的通,有时间的同学可以尝试mod_jk.
mod_ajp+ajp的方式只是卡在了FBA上,其它的任何资源访问,都没问题,为了让FBA工作起来,不得已,我将balancer修改成了http模式。
- BalancerMember http://127.0.0.1:8080 loadfactor=1 route=node1
- BalancerMember http://127.0.0.1:8081 loadfactor=1 route=node2
- ProxySet stickysession=JSESSIONID
- ProxySet lbmethod=byrequests
此外,还有一个陷阱。tomcat在做完j_security_check以后,会重定向到http,无论之前是https. 当然我们可以通过配置server.xml和web.xml使其重定向到Https,但一般不推荐这样做,因为这很可能导致循环重定向。
一般的做法是在web中添加一个filter,专门负责http和https的切换。又或者在apache中配置重定向。在http-vhosts.conf中添加:
- ServerAdmin joey
- ServerName www.test0.com
- ErrorLog "logs/errlog"
- CustomLog "logs/accesslog" common
- RewriteEngine on
- RewriteRule ^/?sessiontest/(.*) https://%{SERVER_NAME}/sessiontest/$1 [R,L]
到此,网站可以在FBA的模式下正常运行了。
#p#
FBA的缺陷
在J2EE的规范中,FBA存在着很大的缺陷。列举如下:
login的过程无法被干预。我们无法通过添加filter的形式进行干预。login完全交给web容器处理,页面也是有web容器负责展示。
没有login地址,用户无法bookmark一个Login页面。直接访问login.html是无法提交form的。login只能在访问受保护资源的时候才会被触发。
很不幸的是,tomcat完全遵循了J2EE关于FBA的规范,这使得FBA很不实用。 WebSphere Application Server则对规范进行了变通,使得以上2个缺陷都被除去了。 Jboss, Glassfish和weblogic则不是很清楚,需要了解的同学可以去查看其文档。
Tomcat build-in SSO
Tomcat本身集成SSO(Single Sign On)解决方案。如果一个tomcat上,部署了多个应用,这时候可以使用tomcat自身的SSO解决方案。如果系统跨JVM甚至跨平台,则需要一套复 杂的SSO解决方案。复杂的SSO解决方案需要自己开发,或者使用第三方框架,如CAS, OPENSSO等。
这次的实验,仅仅关注tomcat自带的SSO方案。首先需要说明,tomcat自带的SSO的必要前提是:
接下来,我将重新复制一份新的tomcat, 取名tomcat3. 在tomcat3\webApps下面,tomcat自带一个web应用,叫做examples,其下/examples/jsp/security /protected/index.jsp是受FBA保护的。
修改server.xml,添加realm
- resourceName="UserDatabase"/>-->
- connectionName="cn=admin,dc=mycompany,dc=com"
- connectionPassword="admin"
- connectionURL="ldap://localhost:389"
- userPassword="userPassword"
- userPattern="uid={0},ou=people,dc=mycompany,dc=com"
- roleBase="ou=groups,dc=mycompany,dc=com"
- roleName="cn"
- roleSearch="(uniqueMember={0})"
- />
继续修改server.xml, 打来host下面的SSO配置:
然后修改examples下面的web.xml, 将受保护的资源的允许访问角色修改成:
red
这样,tomcat3下面就有一个使用OpenLDAP认证的应用examples了。接下来,我将examples复制一份,取名叫 examples2,放在相同目录下。现在tomcat3下面存在两个应用examples和examples2,它们使用同一个realm认证。
启动tomcat3, 访问http://localhost:8080/examples/jsp/security/protected/index.jsp和http://localhost:8080/examples2/jsp/security/protected/index.jsp, 发现只需要登录其中一个,另一个不再需要登录。
接下来
由于FBA的缺陷,我们需要自己制作login机制。实际上很多互联网网站都是自己的login机制。我将借助第三方认证工具,比如SecurityFilter或Spring来重新制作login。链接稍后贴上。
原文链接:http://my.oschina.net/xpbug/blog/198765
分享文章:Tomcat认证授权与简单的SSO
分享网址:http://www.shufengxianlan.com/qtweb/news44/206194.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联