下面讲述 Tomcat 和 OpenLDAP 配置,限制用户访问
1.Tomcat 服务器配置
每一个应用可以在各自的
<Context>
元素中配置自己的 Realm; 这个 realm 仅仅是对该应用是有效的. 然而, realm 也能配置到
<Engine>
或
<Host>
级别上. 它们对 realm 的行为和范围有影响. 这样允许一个 realm 很容易的在多个应用间共享.
这里有一个 server.xml 的realm, 它允许应用连接到 OpenLDAP.
<RealmclassName="org.apache.catalina.realm.JNDIRealm"
debug="99"
connectionName="cn=Manager,dc=mycompany,dc=com"
connectionPassword="secret"
connectionURL="ldap://localhost:389"
roleBase="ou=roles,dc=mycompany,dc=com"
roleName="cn"
roleSearch="(uniqueMember={0})"
roleSubtree="false"
userSearch="(uid={0})"
userPassword="userPassword"
userPattern="uid={0},ou=people,dc=mycompany,dc=com"
/>
使用方法:在D盘建立一个文件夹用于存放相应的文件比如:D:\LDAPTest
将Tomcat文件包放入该文件目录D:\LDAPTest\apache-tomcat-6.0.30
更改D:\LDAPTest\apache-tomcat-6.0.30\conf目录下server.xml
将以上代码加入到
<body>
<formmethod="POST" action="j_security_check">
<inputtype="text" name="j_username">
<br>
<inputtype="password" name="j_password">
<br>
<inputtype="submit">
</form>
</body>
必须参考新的 OpenLDAP realm 来更新web.xml 文件, 并在其中使用 LDAP 指定的角色. 应用还需要让对login.jsp 页面的访问权限是公开的; 不然的话, 没有用户能登陆.
要告知应用什么角色能访问什么资源, 就要在应用 (或安全约束) 中用到 URL 映射. 这种映射既可以是一个文件名 (/admin.jsp) 也可以是一个路径 (/jsp/* 将保护jsp 目录中的任何东西). 下面的 XML 表示列出的这两个.jsp 文件不受到保护.
<security-constraint>
<web-resource-collection>
<web-resource-name>Public Area</web-resource-name>
<!--Define the context-relative URL(s) to be protected -->
<url-pattern>/index.jsp</url-pattern>
<url-pattern>/login.jsp</url-pattern>
</web-resource-collection>
</security-constraint>
为什么这个代码会标记其他的 .jsp 文件为不受保护呢? 这是由于未列出的不受保护, 而非列出来的才不受保护. 下面的 web.xml 片断标明了 user.jsp 资源是受保护的, 并指定了什么角色可访问它.
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<!--Define the context-relative URL(s) to be protected -->
<url-pattern>/user.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<!-- Anyonewith one of the listed roles may access this area -->
<role-name>TestUsers</role-name>
<role-name>Special Users</role-name>
<role-name>Admin Users</role-name>
</auth-constraint>
</security-constraint>
注意到那个受保护资源有还有另一个节点配置,
<auth-constraint>
, 它指定了什么应用角色可以访问上面的资源. 假如存在
<auth-constraint>
配置, 资源就会是安全的. 否则, 它们就是公开的. 除非整个应用都是受保护的 (例如,
<url-pattern>/</url-pattern>
), 公开的权限约束完全是多余.
欲配置 web.xml 文件利用前面创建的 login.jsp , 要添加下面的代码到 web.xml 文件中.
<!-- usesform-based authentication -->
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/fail_login.html</form-error-page>
</form-login-config>
</login-config>
最后是对 web.xml 的一个附加配置步骤: 应用需要被知会我们要用到哪些角色.
<!-- Security roles referenced by this web application-->
<security-role>
<role-name>Test Users</role-name>
</security-role>
<security-role>
<role-name>Special Users</role-name>
</security-role>
<security-role>
<role-name>Admin Users</role-name>
</security-role>
现在 Tomcat 已被配置为使用 OpenLDAP 并且我们的应用也对 web.xml 文件进行了正确的设置. 当用户首次被导航到
<security-constraint>
中列出的任何资源时 (只要不是公开的资源) , 服务器会自动显示login.jsp 页面要求用户验证. 假如用户验证失败,将会显示在
<form-error-page>
中指定的页面. 要是验证用户是通过了, 但是未授权访问某个资源 (比如, 不是某个角色的成员), 服务器会返回一个 403 错误页. 想要的话, 错误页可以在web.xml 文件中定制, 使用
<error-code>
元素.
注,web.xml 中的元素有一个特定的顺序 (定义在 DTD 文件中), 所以你应该看看例子代码 中完整的web.xml文件. 尤其是
<login-config>
和
<security-role>
中的元素顺序.
现在用户可以登陆了, 但是该如何登出呢? 可以写代码来让用户的会话失效, 或者我们可以使用 Apache Jakarta 项目提供的便利的会话标签库.
3.Jakarta 相应标签库
通过加入 logout.jsp 到应用中并使用 Apache Jakarta Project 的会话标签库 , 我们能在不写任何定制代码情况下就失效掉的用户 (在实际的应用中, 你也许还需为清除一个用户会话做更多一些事情, 你也可能不怎么满意这么做).
<body>
<sess:invalidate/>
You are nowlogged out<br>
<ahref="index.jsp">Return to index</a>
</body>
一旦包含用
<sess:invalidate/>
标签的 JSP 页面显示之后, 用户会话便被移除, 该用户被有效的注销掉了. 简单的放置一个链接指向logout.jsp 页面, 就能让用户导航该页, 这足以应付简单的应用. 另, 除会话标签库外, 我们还能利用 request 标签库来定制化基于用户和角色 JSP 页面的内容.
<req:isUserInRole role="Admin Users">
The remote useris in role "Admin Users".<br />
</req:isUserInRole>
前述的 JSP 片断只有在当前用户在请求的角色中时才显示内容. 要验证角色安全性的行为, 可以用 JXplorer 快速的从角色中添加和移除用户.
4.使用web应该测试权限
方法:将配置好的ldap应用放入D:\LDAPTest\apache-tomcat-6.0.30\webapps
目录下。并启动Tomcat服务。
在地址栏输入:
http://localhost:8080/ldap/index.jsp
以上就是关于访问权限的配置,有一部分还是借鉴了别人的,如有不足之处,还请批评改正。谢谢~