在我的项目一开始的时候由于时间关系,没能摸清楚如何实现用自己写的模块处理登录,所以就采用了比较简单RDBMS(即用Jboss的DatabaseServerLoginModule)模块处理登录事件,然后通过一个过滤器判断用户是否已经登录,如果登录了再从数据库中读取用户信息到session中。虽然自己都感觉到有点不伦不类,但我还是将我的具体实现方式在下面写出来:
1. 配置login-config.xml
编辑Jboss主目录下的
server/default/conf 目录下的login-config.xml文件,在<policy>节点下加入如下的内容:
<policy>
….
<application-policy name = "nccnm">
<authentication>
<login-module code = "org.jboss.security.auth.spi.DatabaseServerLoginModule" flag = "required">
<!--
配置访问数据库的连接池名称为
cnmtestds -->
<module-option name = "dsJndiName">java:/ testds</module-option>
<!--
配置根据登录名获取密码的
sql
语句
-->
<module-option name = "principalsQuery">SELECT PASSWORD FROM OPERATOR WHERE LOGINID=?</module-option>
<!--
配置根据登录名获取用户角色的
sql
语句
-->
<module-option name = "rolesQuery">SELECT ROLENAME,'Roles' FROM V_ROLE WHERE LOGINID=?</module-option>
<!--
使用
MD5
方式加密密码
-->
<module-option name="hashAlgorithm">MD5</module-option>
<!--
将加密后的密码再转为
base64
编码
-->
<module-option name="hashEncoding">base64</module-option>
</login-module>
</authentication>
</application-policy>
….
</policy>
在这里顺便简单介绍一下MD5和Base64。MD5
是一种不可逆的编码算法,即你不可能由已经加密的密码字符串来根据固定的算法还原出原来的密码,据说现在的银行系统大多数采用这种方式来储存用户密码,所以如果用户的密码遗失了,银行也不可能通过查数据库给你找回你原来设的密码,只能重新设置。要破解
MD5
的密码只能用很笨很好时的穷举法。
而
Base64
的编码其实大家都应该经常接触,我们的电子邮件一般都是经过
Base64
编码后传送的,如果您用的是
Outlook Express
收发邮件,那你可以通过邮件的“属性
/
详细信息
/
邮件来源”看到邮件的
Base64
编码的信息。它将二进制数据编码为字母和数字,因为字母和数字的个数少于
256
,所以它是把
3
个字节的二进制数据转换为
4
个字节的字母和数字。所以经过
base64
编码的文件会比原来的文件大
4/3
倍。
Jboss
用专门的
API
来处理
md5
加密及
base64
的编码和反编码。
2.
配置连接池
上面的文件中用到了一个名为testds的连接池,现在就来配置这个连接池。我这里用的是oracle数据库,其它的数据库的配置方式就不一一介绍了。具体的表结构和建表的sql语句我这里也不再描述了,如果有不清楚的地方清留言问我。
编辑JBoss主目录下的server/default/deploy目录 (什么?你的目录下没有找到这个文件,没关系,从你的Jboss主目录的docs/examples/jca下copy一个过来)。在<datasources>节点之间加入如下内容:
<local-tx-datasource>
<jndi-name>testds</jndi-name>
<connection-url>jdbc:oracle:thin:@127.0.0.1:1521:mydb</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<user-name>test</user-name>
<password>123</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
<metadata>
<type-mapping>Oracle9i</type-mapping>
</metadata>
</local-tx-datasource>
3. 配置jboss-web.xml
JBoss下的配置就完成了,下面再配置我们的项目里的文件。
打开你的Web应用下的Web目录下的的WEB-INF目录,新建一个jboss-web.xml的文件,在文件中加入如下内容:
<jboss-web>
<!-- Uncomment the security-domain to enable security. You will
need to edit the htmladaptor login configuration to setup the
login modules used to authentication users.
-->
<!--
下面的
nccnm
就是在
login-config.xml
配置的
application-policy
的名称
-->
<security-domain>java:/jaas/ nccnm </security-domain>
</jboss-web>
这个配置会告诉Jboss我们这个应用的JAAS安全性策略到哪里去找。
4. 配置web.xml
打开你的Web应用下的Web目录下的的WEB-INF目录,编辑web.xml (这个文件应该能找到吧?如果找不到就麻烦了,从头去啃J2EE),加入如下的内容:
<security-constraint>
<web-resource-collection>
<web-resource-name>login required</web-resource-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.htm</url-pattern>
<url-pattern>*.html</url-pattern>
<url-pattern>*.do</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>role1</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<!-- 通过表单方式来提交登录
-->
<auth-method>FORM</auth-method>
<realm-name>mydomain</realm-name>
<form-login-config>
<!--
登录页面为
login.jsp -->
<form-login-page>/login.jsp</form-login-page>
<!--
登录出错的话转到
error.jsp
页面
-->
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>role1</role-name>
</security-role>
以上内容的作用是本Web应用下的所有jsp,htm,html,do为扩展名的资源都要登录后才能访问(你可以根据你的需要来设置,通常你可以设置<url-pattern>* </url-pattern>来限制没有登录所有的资源都不能访问),而且只有role1角色的用户才能访问。
如果我想要某些jsp页面不登录也能访问怎么办?我是这样处理的,也不知道是不是歪门邪道,再加一个security-constraint策略:
<security-constraint>
<web-resource-collection>
<web-resource-name>not login required</web-resource-name>
<url-pattern>/report/*</url-pattern>
<url-pattern>/css/*</url-pattern>
</web-resource-collection>
</security-constraint>
这样你的Web应用下的report和css目录下的任何资源都不需要登录就可以访问了。
5. 配置登录页面
在Web应用的主目录下新建一个login.jsp文件,加入如下内容:
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>登录页面</title>
</head>
<body>
<form name="loginForm" method="POST" action="j_security_check">
<table width="100%" border="0" cellspacing="2" cellpadding="3">
<tr><td>
<input type="text" name="j_username" style="width:170px">
</td> </tr>
<tr><td>
<input type="password" name="j_password" style="width:170px">
</td>
</tr>
<tr><td></td><td><input type="submit" value="登录"></td></tr>
</table>
</form>
</body>
</html>
OK,现在大功告成,把你的Web应用发布到Jboss下试试吧。其实我这里介绍的内容在我的上一篇文章都已经描述了,只不过我是把具体一实现又重新写了一遍。
在下一篇文章中我将要介绍一下如何实现自己编写的登录模块,如何把用户信息保存到session中,可能这种方式才是最主要的。