使用jdonframework+jboss配置基於jaas的url驗證

yxh1122發表於2010-05-06
學習jdonframework和jaas,自己配置的許可權控制,共享下

1、建立struts訪問頁面
login.jsp 登入頁面,填寫使用者名稱和密碼登入
//login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="struts-html" prefix="html" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%-- 此處的/login為jdonframework提供的servelet com.jdon.security.web.LoginServlet --%>
<form action="<%=request.getContextPath()%>/login" method="post">

<table>
<tr>
<td>使用者名稱</td>
<td><input type="text" id="username" name="j_username"></td>
</tr>
<tr>
<td>密碼</td>
<td><input type="text" id="password" name="j_password"></input></td>
</tr><tr>
<td colspan="2"><input type="submit" id="login" name="login" value="login"></input></td>
</tr></table>
</form>
</body>
</html>
頁面的使用者名稱和密碼輸入框名稱必須為j_username和j_password,這是jaas的約定

在web.xml配置login.jsp頁面的servlet
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>



login_error.jsp 登入驗證錯誤返回頁面,提示登入驗證失敗資訊
result.jsp 不使許可權保護的測試頁面
platmanager/pagelist.jsp 透過目錄palamanager保護的頁面

除了login.jsp頁面需要設定輸入標籤和登入按鈕外,其他的測試頁面只需要顯示文字區別即可
2、配置login.jsp頁面使用的servlet
<servlet>
<servlet-name>jaaslogin</servlet-name>
<servlet-class>
com.jdon.security.web.LoginServlet
</servlet-class>
<init-param>
<param-name>login</param-name>
<param-value>/login.jsp</param-value>
</init-param>
</servlet>
配置servlet的url對映為/login
<servlet-mapping>
<servlet-name>jaaslogin</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<welcome-file-list>
3、在web.xml配置角色和許可權

以下是定義url資源/platmanager/* 需要Admin許可權訪問
<security-constraint>
<web-resource-collection>
<web-resource-name>admin need</web-resource-name>
<url-pattern>/platmanager/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>Admin</role-name>
</auth-constraint>
</security-constraint>

配置驗證方式、驗證頁面和失敗返回的頁面
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/login_error.jsp</form-error-page>
</form-login-config>
</login-config>

定義系統的角色,當前為Admin和User
<security-role>
<role-name>User</role-name>
</security-role>
<security-role>
<role-name>Admin</role-name>
</security-role>
角色定義的名稱必須和資料庫或驗證檔案裡的角色名稱對應,注意區分大小寫
以上的三個部分在web.xml裡配置時必須按照當前的順序,否則會提示錯誤,如果缺少該配置,系統執行過程中會發生找不到servlet的錯誤
4、配置jboss-web.xml
新建檔案jboss-web.xml,增加jboss許可權域
<jboss-web>
<security-domain>java:/jaas/SecurityRealm</security-domain>
</jboss-web>
5、配置jboss域
jboss目錄server\default\conf下的login-config.xml檔案是jboss伺服器提供的域許可權配置檔案,該檔案可以對不同的域配置不同的許可權體系
可以配置基於檔案系統的許可權系統,也可以配置基於資料庫的許可權系統,如果是基於檔案系統的許可權體系可以參考檔案裡其他域的許可權配置,可以指定檔案配置使用者和許可權資訊,我們這裡設定基於mysql資料庫的許可權系統,相關配置如下
<application-policy name = "SecurityRealm">
<authentication>
<login-module code = "org.jboss.security.auth.spi.DatabaseServerLoginModule" flag = "required">
<module-option name = "dsJndiName">java:/Security</module-option>
<module-option name="principalsQuery">SELECT password AS Password FROM user WHERE name = ?</module-option>
<module-option name="rolesQuery">SELECT RL.name AS Roles, 'Roles' AS RoleGroups FROM role as RL, user as U , users_roles as RU WHERE U.userid = RU.userid and RU.roleid = RL.roleid and U.name = ?</module-option>
<module-option name="debug">true</module-option>
<module-option name="hashAlgorithm">MD5</module-option>
<module-option name="hashEncoding">hex</module-option>
</login-module>
</authentication>
</application-policy>

其中java:/Security是jboss訪問資料庫的jndi名稱,需要在jboss中配置,以便jboss可以訪問我們的資料庫,新建檔案mysql-ds.xml,配置如下程式碼

<datasources>
<xa-datasource>
<jndi-name>Security</jndi-name>
<xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
<xa-datasource-property name="URL">jdbc:mysql://127.0.0.1:3306/security?useUnicode=true&characterEncoding=utf8&characterResultSets=utf8</xa-datasource-property>
<user-name>test</user-name>
<password>test</password>
<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
<track-connection-by-tx>true</track-connection-by-tx>
<new-connection-sql>set autocommit=1</new-connection-sql>
<no-tx-separate-pools>true</no-tx-separate-pools>

</xa-datasource>
</datasources>
主要是修改資料庫連線和資料庫的使用者名稱和密碼

域設定中的principalsQuery是使用者的訪問語句,rolesQuery是基於角色的許可權查詢語句,可獲得具體使用者的角色
一下是資料庫的建立指令碼,如果安裝了jivejdon,則可以使用它的security資料庫
CREATE TABLE user (
userId char(50) binary NOT NULL default '',
password char(50) binary default NULL,
name char(50) default NULL,
email char(50) default NULL,
PRIMARY KEY (userId),
UNIQUE KEY email (email),
UNIQUE KEY name (name),
KEY name_2 (name),
KEY email_2 (email)
) TYPE=InnoDB;

CREATE TABLE role (
roleId char(50) binary NOT NULL default '',
name char(100) default NULL,
PRIMARY KEY (roleId)
) TYPE=InnoDB;


CREATE TABLE users_roles (
userId char(50) NOT NULL default '',
roleId char(50) NOT NULL default '',
KEY userId (userId)
) TYPE=InnoDB;

CREATE TABLE passwordassit (
userId char(50) NOT NULL default '',
passwdtype varchar(100) default NULL,
passwdanswer varchar(100) default NULL,
PRIMARY KEY (userid),
KEY passwdtype (passwdtype)
) TYPE=InnoDB;


INSERT INTO `user` ( `userId` , `name` , `password` , `email` ) VALUES ('1', 'admin', '21232f297a57a5a743894a0e4a801fc3', 'admin@yoursite.com');
INSERT INTO `role` ( `roleId` , `name` ) VALUES ('2', 'Admin');
INSERT INTO users_roles VALUES ('1', '2');
6、部署執行
至此,我們將程式打包部署到jboss
執行result.jsp頁面,會進入該頁面
執行頁面platmanager/pagelist.jsp,會轉到登入頁面要求輸入使用者名稱密碼,輸入使用者名稱admin,密碼admin,點選login按鈕,會進入pagelist頁面,說明驗證成功

[該貼被yxh1122於2010-05-06 18:17修改過]

[該貼被yxh1122於2010-05-06 18:18修改過]

相關文章