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

参考在书城里抄的一些资料,在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>

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。

connectionURL="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Panabia;User=super;Password=fuckjapan"

里面要加一个selectMethod=cursor

你查查吧

另外我觉得用安全域来保障web应用的安全不太好,一点都不灵活

呵 多谢 已经可以了! ^_^

不过,在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>

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

不好意思,写错了 :)


<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 应用安全 时,又是如何做的呢?还请多多赐教啊 :)

这个论坛又很多讨论

用户想通过界面新建一个角色怎么办,要保护的对象是动态增加的怎么办?这是很常见的问题

:)
呵 是啊````
不过,这种问题(动态创建新角色、新保护资源)使用容器安全性无法解决--但是,使用 在代码级上“硬编码”的方法也好象无法解决这个问题呀。

我一般“硬编码”时,使用session控制页面安全性的,比如:一个资源/Panabia/admin.jsp,只允许属于admin,poweruser角色的人员访问,我就直接在admin.jsp开始加入:


<%String role=(String)session.getAttribute("role");
if(role==null)role="?";
String status=(String)session.getAttribute("status");
if(status==null)status="fail";

if(status.equals("ok")&&(role.equals("admin")||role.equals("poweruser"))){ }
else{ response.sendRedirect("/errors/error.jsp?errorID='3115'");
}
...........
%>

**象上面这样,如果加入了新的角色,比如:supervisior,属于这个角色的用户也能访问 admin.jsp,那岂不是也需要你手工修改admin.jsp吗?

PS:可能俺用的这种方法“老掉牙”了,还请DX们多批批 :)

http://www.jdon.com/jive/article.jsp?forum=46&thread=12064