登录失败页面
清单4-2 登录失败页面源代码(error.jsp)
1.
<%@ page language="java" contentType="text/html;charset=gb2312"
%>
2.
<html>
3. <head>
4. <title>登录失败</title>
5. </head>
6. <body bgcolor=#ffffff>
7. <table width="400"
border="0" align="center" cellpadding="0"
8. cellspacing="0">
9. <tr>
10. <td>
11.
<table width="100%" border=0 cellpadding="0"
cellspacing="0">
12. <tr
bgcolor="#FFFFFF">
13.
<td height="25" colspan="2"
align="center" bgcolor="#FFFFFF"
class="title1"> </td>
14.
</tr>
15.
<tr bgcolor="#FFFFFF">
16.
<td height="25" colspan="2" align="center"
bgcolor="#D0D9FD"
class="blank"><h2 class="STYLE1">登录失败</h2></td>
17.
</tr>
18.
<tr bgcolor="#FFFFFF">
19.
<td height="10" colspan="2" bgcolor="#F
0F3FF" class="blank"></td>
20.
</tr>
21.
<tr bgcolor="#FFFFFF">
22.
<td height="10" colspan="2" bgcolor="#F0F3FF" class="blank">
您的用户名或者密码错误,请按此<a href="login.jsp" class="blank">
<span class="STYLE3">重新登录</span></a></td>
23.
</tr>
24.
<tr bgcolor="#FFFFFF">
25.
<td height="10" colspan="2" bgcolor="#F0F3FF" class="blank"></td>
26.
</tr>
27.
</table>
28. </td>
29. </tr>
30. </table>
31. </body>
32. </html>
要使用V-Security安全框架保护您的Web资源,需要完成以下步骤:
1、
修改web.xml配置文件,详细内容参见清单(4-3)
a)
创建名为SecurityFilter的Filter
SecurityFilter的处理类是org.vivianj.web.security.SecurityFilter,默认设置为对所有 Web资源有效,SecurityFilter可以接受三个参数,分别是form-login-page、form-error-page、 form-login-ok-page,他们分别对应的是登录页面的路径、登录失败页面的路径和登录成功页面 的路径,您可以根据自己的实际情况进行修改。
b)
新建一个Session Listener
V-Security安全框架中用户登录信息保存在Session中,因此需要一个Session Listenser处 理用户非正常退出后留下的Session信息。Session Listener的处理类是org.vivianj.web.security.listener.SecuritySessionListener。
c)
新建名为VivianjSecurity的Servlet
V-Security中默认安全提供者(Security Provider)的登录接口就是这个Servlet,它的处理
类是org.vivianj.web.security.SecurityServlet。
清单 4-3 WEB-INF/web.xml
1. <?xml
version="1.0" encoding="GBK"?>
2. <!DOCTYPE
web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application
2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>
3.
4. <web-app>
5. <display-name>security</display-name>
6. <description></description>
7. <filter>
8. <filter-name>SecurityFilter</filter-name>
9. <display-name>SecurityFilter</display-name>
10. <description></description>
11. <filter-class>org.vivianj.web.security.SecurityFilter</filter-class>
12. <init-param>
13. <param-name>form-login-ok-page</param-name>
14. <param-value>ok.jsp</param-value>
15. </init-param>
16. <init-param>
17. <param-name>form-error-page</param-name>
18. <param-value>error.jsp</param-value>
19. </init-param>
20. <init-param>
21. <param-name>form-login-page</param-name>
22. <param-value>login.jsp</param-value>
23. </init-param>
24. </filter>
25. <filter-mapping>
26. <filter-name>SecurityFilter</filter-name>
27. <url-pattern>/*</url-pattern>
28. </filter-mapping>
29.
30. <listener>
31. <listener-class>org.vivianj.web.security.listener.SecuritySessionListener
</listener-class>
32. </listener>
33.
34. <servlet>
35. <servlet-name>action</servlet-name>
36. <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
37. <init-param>
38. <param-name>debug</param-name>
39. <param-value>2</param-value>
40. </init-param>
41. <init-param>
42. <param-name>config</param-name>
43. <param-value>/WEB-INF/struts-config.xml</param-value>
44. </init-param>
45. <init-param>
46. <param-name>detail</param-name>
47. <param-value>2</param-value>
48. </init-param>
49. <load-on-startup>2</load-on-startup>
50. </servlet>
51. <servlet>
52. <servlet-name>DisplaySource</servlet-name>
53. <display-name>DisplaySource</display-name>
54. <description>display
source of sample jsp pages</description>
55. <servlet-class>org.displaytag.sample.DisplaySourceServlet</servlet-class>
56. </servlet>
57. <servlet>
58. <servlet-name>VivianjSecurity</servlet-name>
59. <display-name>VivianjSecurity</display-name>
60. <description></description>
61. <servlet-class>org.vivianj.web.security.SecurityServlet</servlet-class>
62. </servlet>
63. <servlet-mapping>
64. <servlet-name>VivianjSecurity</servlet-name>
65. <url-pattern>/security</url-pattern>
66. </servlet-mapping>
67. <servlet-mapping>
68. <servlet-name>DisplaySource</servlet-name>
69. <url-pattern>*.source</url-pattern>
70. </servlet-mapping>
71. <servlet-mapping>
72. <servlet-name>action</servlet-name>
73. <url-pattern>*.do</url-pattern>
74. </servlet-mapping>
75. <welcome-file-list>
76. <welcome-file>login.jsp</welcome-file>
77. <welcome-file>index.html</welcome-file>
78. <welcome-file>upload.jsp</welcome-file>
79. </welcome-file-list>
80. <taglib>
81. <taglib-uri>/tags/struts-bean</taglib-uri>
82. <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
83. </taglib>
84. <taglib>
85. <taglib-uri>/tags/struts-logic</taglib-uri>
86. <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
87. </taglib>
88. <taglib>
89. <taglib-uri>/tags/struts-html</taglib-uri>
90. <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
91. </taglib>
92. <taglib>
93. <taglib-uri>/tags/struts-tiles</taglib-uri>
94. <taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
95. </taglib>
96. <taglib>
97. <taglib-uri>http://displaytag.sourceforge.net/</taglib-uri>
98. <taglib-location>/WEB-INF/displaytag-11.tld</taglib-location>
99. </taglib>
100. <taglib>
101. <taglib-uri>/tags/struts-nested</taglib-uri>
102. <taglib-location>/WEB-INF/struts-nested.tld</taglib-location>
103. </taglib>
104. </web-app>
2、
增加安全约束声明
修改WEB-INF/classes/config/security-resources.xml。
a) 为需要保护的资源增加新的security-constraint元素
保护的URL可以是HTML、JSP、Servlet或者其他可访问的Web资源。清单4-4中要保护的URL是 /undersecurity/declarative/b.jsp。
b) 为被保护的资源加入角色
security-constraint元素中可以加入roles元素声明访问被保护资源所必需具备的角色,角 色可以使用role元素增加多个。比如清单4-4中被保护的资源可以被角色为”roleA”和”roleB” 的用户同时访问
清单4-4 WEB-INF/classes/config/security-resources.xml
1. <?xml
version="1.0" encoding="GBK"?>
2.
3. <security-constraints>
4. <security-constraint
name="adminSecurity">
5. <web-resource>
6. <url-pattern>/undersecurity/declarative/b.jsp</url-pattern>
7. </web-resource>
8. <roles>
9.
<role name="roleA"
/>
10. <role
name="roleB" />
11. </roles>
12. </security-constraint>
13. </security-constraints>
3、编写欢迎页面(ok.jsp)
下面是一个欢迎页面(ok.jsp)的示例界面。
图4-3 欢迎页面(ok.jsp)
清单4-5 ok.jsp
1.
<%@ page language="java" contentType="text/html;charset=gb2312"
%>
2. <%@ page import="org.vivianj.web.security.util.PageSecurity"
%>
3. <html>
4. <head>
5. <title登录成功</title>
6. <style type="text/css">
7. td {
8. font-size: 14px;
9. }
10. .title1 {
11. font-size: 14px;
12. color: #00000;
13. }
14. -->
15. </style>
16. <link href="css/screen.css"
rel="stylesheet" type="text/css">
17. <style type="text/css">
18. <!--
19. .STYLE3 {color: #FF0000}
20. -->
21. </style>
22. </head>
23. <body bgcolor=#ffffff>
24. <table width="600" border="0"
align="center" cellpadding="0"
25. cellspacing="0"
class="page">
26. <tr>
27. <td>
28. <table width="100%" border=0
cellpadding="0" cellspacing="0">
29. <bgcolor="#FFFFFF">
30. <td height="25" colspan="4"
class="title1" align="center"> </td>
31. </tr>
32. <tr bgcolor="#FFFFFF">
33. <td height="25" colspan="4"
align="center" bgcolor="#D0D9FD" class="title1">
<h2>欢迎您选择V-Securt开源框架!</h2></td>
34. </tr>
35.
36.<tr bgcolor="#FFFFFF">
37.<td height="10" colspan="3"
bgcolor="#E2E8FE" align="center"恭喜 <span
class="STYLE3"><%= PageSecurity.getUserPrincipal(request)
%></span> 登录成功!
38. <td>
39. <td align="right" colspan="1"
bgcolor="#E2E8FE"><span class="STYLE3"><a
href="<%=request.getContextPath()%>/console/loginOutView.do?userName=
<%=PageSecurity.getUserPrincipal(request)%>"安全退出</a></span></td>
40. </tr>
41.
42. <tr bgcolor="#FFFFFF">
43. <td height="1" bgcolor="#0099FF"
colspan="4"></td>
44. </tr>
45. <tr bgcolor="#FFFFFF">
46.
<td width="19%" height="10" align="center"
class="indexleftjsp">管 理</td>
47. <td width="25%"
align="center"><a href="#">个 人信
息</a></td>
48. <td width="28%"
height="10" align="center"><a href="#"内
容 发 布</a></td>
49. <td
width="28%" height="20" align="center"><a
href="console/main.jsp"
class="STYLE3"安 全 管 理</a></td>
50. </tr>
51. <tr align="center"
bgcolor="#FFFFFF">
52. <td height="1" colspan="4"
bgcolor="#0099FF"></td>
53. </tr>
54. <tr bgcolor="#FFFFFF">
55. <td height="20" align="center"
class="indexleftjsp"服 务</td>
56.
<td align="center"><a href="#"同
学 搜 索</a></td>
57.
<td height="10" align="center"><a
href="#">免 费 邮 箱</a></td>
58. <td
height="10" align="center"><a href="#"长
沙 社 区</a></td>
59.
</tr>
60. <tr bgcolor="#FFFFFF">
61. <td height="1" bgcolor="#0099FF"
colspan="4"></td>
62. </tr>
63.
<tr bgcolor="#FFFFFF">
64. <td height="20"
align="center" class="indexleftjsp">安全示例</td>
65. <td align="center"><a
href="undersecurity/declarative/b.jsp">声明式安全</a></td>
66.
<td height="10" align="center"><a
href="undersecurity/programmatic/c.jsp">
编程式安全</a></td>
67. <td
height="10" align="center"><a href="undersecurity/join/c.jsp"混合式安全</a></td>
68.
</tr>
69. <tr bgcolor="#FFFFFF">
70.
<td height="1" bgcolor="#0099FF"
colspan="4"></td>
71. </tr>
72. </table>
73.</td>
74. </tr>
75. </table>
76. </body>
77. </html>
4、编写被保护的资源(b.jsp)
下面是一个被保护的资源(b.jsp)。
图4-4显示了被保护的资源对应的界面
清单4-6 b.jsp中是被保护资源对应的源代码。
图4-4 被保护的资源
清单4-6 undersecurity/declarative/b.jsp
1. <%@ page
language="java" contentType="text/html;charset=gb2312"
%>
2. <%@
page import="org.vivianj.web.security.util.PageSecurity"
%>
3.
<html>
4.
<head>
5.
<title>V-Security页面级安全示例页</title>
6.
<style type="text/css">
7. td {font-size:
14px;
8.
9. }
10. .title1 {
11.
font-size: 14px;
12.
color: #00000;
13. }
14. -->
15. </style>
16. <link href="css/screen.css"
rel="stylesheet" type="text/css">
17. <style type="text/css">
18. <!--
19. .STYLE3 {color: #FF0000}
20. -->
21. </style>
22. </head>
23.
<body>
24.
25. <table width="400"
border="0" align="center" cellpadding="5"
cellspacing="0">
26. <tr>
27. <td
align="center" bgcolor="#D0D9FD" valign="middle"><h2>V-Security页面级安全示例页</h2></td>
28. </tr>
29. <tr>
30. <td
bgcolor="#E2E8FE">
31. <br>
32. 本示例页基于页面级安全保护,只有角色为"roleA"或者"roleB"的用户才有权访问.
33.
<br>
34. <br>当前登录用户 <font color="red"><%=
PageSecurity.getUserPrincipal(request) %><br> </font></td>
35. </tr>
36. </table>
37.
38.
</body>
39. </html>
5、完成角色影射
请参考1管理安全提供者(Security
Provider)中的说明完成角色影射工作。
完成上述步骤后,将V-Security项目发布到服务器上,然后启动服务器,访问/undersecurity/declarative/b.jsp页面,
我们将看到登录页面(因为该资源被保护),输入正确的用户名和密码后登录,再次访问/undersecurity/declarative/b.jsp,
我们将能够看到b.jsp中的界面。