在Tomcat中使用容器提供的鑑別

JSP頁面往往在容器提供的一個運行時環境中執行。相應地,所有鑑別和訪問控制都可以由容器處理,從而將應用開發人員解脫出來,而不必完成諸如實現適當安全控制等重要任務。安全性很難把握,因此作爲起步,使用容器提供的機制往往是上選之策,這些機制已經經受了時間的考驗,本文以Tomcat爲例,簡單的配置使用容器提供的鑑別功能。相關代碼見附件。

一:首先創建項目

項目目錄結構


 其中admin目錄爲需要進行訪問控制的,login.html爲登陸頁面。login登陸界面使用表單向容器提供鑑別信息。表單內容如下:

<form name="logonForm" method="post" action="j_security_check">
<table>
	<tr>
		<td>User Name:</td>
		<td><input type="text" name="j_username"></td>
	</tr>
	<tr>
		<td>Password:</td>
		<td><input type="password" name="j_password"></td>
	</tr>
	<tr colspan="2">
		<td><input type="submit" value="login"></td>
	</tr>
</table>
</form>

 其中action爲j_security_check ,用戶名爲j_username ,密碼爲j_password

二:設置web.xml

在web.xml文件添加以下配置信息

<security-constraint>
		<web-resource-collection>
			<web-resource-name>adminPage</web-resource-name>
			<url-pattern>/admin/*</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>admin</role-name>
		</auth-constraint>
	</security-constraint>

	<security-role>
		<role-name>admin</role-name>
	</security-role>

	<login-config>
		<auth-method>FORM</auth-method>
		
		<form-login-config>
			<form-login-page>/login.html</form-login-page>
			<form-error-page>/login-error.html</form-error-page>
		</form-login-config>
	</login-config>

 <security-constraint>元素包含一個<web-resource-collection>元素,它定義了要保護的資源,還包含一個<auth-constraint>,這個元素包含一個角色名,定義了誰有權限訪問這個資源。<security-constraint>使用url-patten來定於需要保護的URL地址。<security-role>元素定義了必須映射至容器安全域中的用戶的所有角色名。<login-config>元素定義了需要使用的鑑別方式,以及與鑑別相關的信息。servlet容器支持4種鑑別方式,分別是BASIC,DIGEST,FORM,CLIENT-CERT,本文以最常見的FORM表單鑑別爲例,其他鑑別方式請查看相應文檔。<form-login-config>中指定了登陸頁面和密碼錯誤重定向到的頁面。

三:配置安全域

安全域是一個存儲用戶名,密碼和角色名的數據庫。servlet標準中不包含對安全域配置的描述,所以只能使用與容器相關的配置來指定安全域。

在Tomcat中,可以指定多種安全域,包括JDBCRealm,DataSourceRealm,JNDIRealm,MemoryRealm,JAASRealm。本文配置JDBCRealm安全域使用mysql數據庫存儲用戶信息。關於其他安全域的配置,請查看Tomcat文檔

安全域配置信息可以放置在Tomcat配置文件<Engine>或<Host>元素中作爲全局安全域,供多個應用程序使用。也可以放置在WEB-INF/context.xml文件<Context>元素中,供當前應用程序使用。context.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>

<Context antiJARLocking="true" path="hotweb">
	<Realm className="org.apache.catalina.realm.JDBCRealm"
		driverName="com.mysql.jdbc.Driver"
		connectionURL="jdbc:mysql://localhost:3306/hotweb"
		connectionName="root"
		connectionPassword="root"
		userTable="users" 
		userNameCol="user_name" 
		userCredCol="user_pass"
		userRoleTable="user_roles" 
		roleNameCol="role_name" />
</Context>

 <Realm>元素配置爲使用mysql數據庫保存鑑別信息。mysql數據庫表結構爲:

create table users (
  user_name         varchar(15) not null primary key,
  user_pass         varchar(15) not null
);

create table user_roles (
  user_name         varchar(15) not null,
  role_name         varchar(15) not null,
  primary key (user_name, role_name)
);

userTable元素指定用戶表,userNameCol和userCredCol分別指定用戶名和密碼的列名。userRoleTable指定角色表,roleNameCol指定角色名列名。注意userNameCol指定的用戶列名在兩個表中必須相同。插入測試數據

insert into users values('admin','admin');
insert into user_roles values('admin','admin');

 

啓動瀏覽器訪問http://localhost:8080/hotweb/admin/security.html,重定向到登陸頁面,使用admin,admin登陸。登陸錯誤則重定向到login-error.html。相關代碼見附件。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章