使用jdonframework+jboss配置基于jaas的url验证
学习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修改过]