在我的项目一开始的时候由于时间关系,没能摸清楚如何实现用自己写的模块处理登录,所以就采用了比较简单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>
以上内容的是配置JBoss,作用是本Web应用下的所有 jsp,htm,html,do为扩展名的资源都要登录后才能访问(你可以根据你的需要来设置,通常你可以设置<url-pattern>* </url-pattern>来限制没有登录所有的资源都不能访问),而且只有role1角色的用户才能访问。
【编辑推荐】