[请教]应用 JDBCRealm 强制安全时出现SQLException.

04-08-22 Juniper
参考在书城里抄的一些资料,在Tomcat5.0上实验 JDBCRealm 强制安全,保障web应用的安全。

但在配置的时候出现了莫名的SQLException,还请各位DX指点!

配置如下:

1、确定要保护的web应用的path为:/testing/* 即:要访问http://www.sdg.com/testing/ 下所有的应用,都必须通过

JDBCRealm的强制验证。

2、已经配置好了SQL Server,建一数据库Panabia,2个表:users,groups.分别存储用户、用户-角色信息。SQL Server

JDBC驱动程式已经拷贝至%TOMCAT_HOME%\common\lib 下。经试验,JDBC连接SQL Server正常。

3、配置\ROOT\WEB-INF\下的web.xml,添加security-constraint配置段,配置为BASIC方式验证。

如下所示:

<security-constraint>
   <web-resource-collection>
      <web-resource-name>ROLE TEST</web-resource-name>
      <url-pattern>/testing/*</url-pattern>
   </web-resource-collection>
   <auth-constraint>
      <role-name>admin</role-name>
   </auth-constraint>
</security-constraint>

<login-config>
   <auth-method>BASIC</auth-method>
   <realm-name>ROLE TEST</realm-name>
</login-config>
<p>

4、配置Tomcat的 server.xml文件,将原有的 Realm 注释掉,添加如下:

<Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
 driverName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
 connectionURL="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Panabia;User=super;Password=fuckjapan"
 userTable="users" userNameCol="username" userCredCol="password"
 userRoleTable="groups" roleNameCol="role"/>
 

5、重新启动Tomcat,访问http://www.sdg.com/testing/src.jsp 时,弹出对话框,要求输入用户名与密码(我本来以为

已经大功告成了...谁知道.....)

我输入了属于admin角色的帐户:username:super password:fuckjapan

但是始终不能通过验证,最后来一个 HTTP 401 错误--------

**查看Tomcat的 log文件,发现有以下的SQLException:

2004-08-22 14:14:49 JDBCRealm[]: Username super successfully authenticated
2004-08-22 14:14:49 JDBCRealm[]: Exception performing authentication
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Can't start a cloned connection while in manual transaction mode.
	at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)

//........(略)

上面的"Username super successfully authenticated" 说明 JDBCRealm还是工作正常的,起码验证了super帐号--

但为什么又会出现"Exception performing authentication"?

百思不得其解------还请各位DX指点迷津!THKS。

    

daquan198163
2004-08-22 21:55
connectionURL="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Panabia;User=super;Password=fuckjapan"

里面要加一个selectMethod=cursor

你查查吧

daquan198163
2004-08-22 21:57
另外我觉得用安全域来保障web应用的安全不太好,一点都不灵活

Juniper
2004-08-23 09:19
呵 多谢 已经可以了! ^_^

不过,在URL中加入selectMethod=cursor; 起的作用是什么呢?

PS:个人认为,使用容器内置的安全强制要比自己在代码级上进行“硬编码”要好一些啊----容器的securtiy-constraint在限制用户访问、用户角色上也挺灵活的,比如:

一个资源/panabia/* 可以由属于“admin”与“poweruser”的用户访问,就可以在web.xml中声明:感觉挺好---

<security-constraint>
   <web-resource-collection>
      <web-resource-name>ROLE TEST</web-resource-name>
      <url-pattern>/testing/*</url-pattern>
   </web-resource-collection>
   <auth-constraint>
      <role-name>guest</role-name>
      <role-name>admin</role-name>
   </auth-constraint>
</security-constraint>
<p>

**各位大哥在实施web应用安全时,又是如何做的啊? :)

Juniper
2004-08-23 09:22
不好意思,写错了 :)

<security-constraint>
   <web-resource-collection>
      <web-resource-name>ROLE TEST</web-resource-name>
      <url-pattern>/testing/*</url-pattern>
   </web-resource-collection>
   <auth-constraint>
      <role-name>poweruser</role-name>
      <role-name>admin</role-name>
   </auth-constraint>
</security-constraint>

**各位DX在实施web 应用安全 时,又是如何做的呢?还请多多赐教啊 :)

猜你喜欢
2Go 1 2 下一页