3.JBoss如何配置从数据库里读取登录用户的验证信息
来源:互联网 发布:c语言调用函数被跳过 编辑:程序博客网 时间:2024/04/29 05:04
在我的项目一开始的时候由于时间关系,没能摸清楚如何实现用自己写的模块处理登录,所以就采用了比较简单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中,可能这种方式才是最主要的。
- 3.JBoss如何配置从数据库里读取登录用户的验证信息
- 从配置文件里读取配置信息
- ColdFusion如何从数据库读取信息例子
- 从数据库中获取数据来验证登录信息…
- javascript验证用户登录信息
- 查看数据库里用户,进程,锁的信息并且如何杀死他们
- 如何将pictureBox里的图片保存到数据库,然后从数据读取显示
- 用户登录系统数据库验证
- C#如何从数据库里读取iamge类型的数据,让其显示在pictureBox里(整理)
- QuickCSharp框架开发(19)------验证成功后从数据库中读取该用户隶属的所有角色
- JAVA-练习MyShopping_verify验证用户登录信息
- 如何读取Info.plist里自己添加的信息
- Servlet实现用户的登录注册+sqlite数据库验证
- 从程序集里读取信息
- C#如何从文本文件读取信息并使用ArrayList类向用户显示该信息
- 如何跳出iframe(针对登录用户的session验证)
- (转载)服务应用程序如何访问当前登录用户的信息
- 服务应用程序如何访问当前登录用户的信息
- C++大型项目开发约束
- 简单的PCM类型的WAVE的文件格式
- 说说MSN图片病毒
- 函数调用约定
- 歌词6-在路上
- 3.JBoss如何配置从数据库里读取登录用户的验证信息
- Java数据库连接、操作以及应用规范编码举例
- java RMI 原理与编程(分布式对象1)
- listbox
- 学习Asp.Net经常会用到的函数集
- 模板的分离编译
- The Elements of Java Style——前言
- 篡改村长的小诗
- 基于GridView日程管理