1

しばらくの間解決できない厄介なエラーがあります。私は最近、コンテナベースのセキュリティを紹介され、それを実装しようとしています。レルムを次のように構成しました。

<Realm className="org.apache.catalina.realm.JDBCRealm" 
debug="99" 
driverName="com.mysql.jdbc.Driver" 
connectionURL="jdbc:mysql://127.0.0.1:3306/identify" 
connectionName="adm" connectionPassword="pw" 
userTable="users" userNameCol="login" 
userCredCol="password" 
allRolesMode="authOnly" /> 
</Realm>

残念ながら、これではログインできません。ログエラーメッセージは次のとおりです。

SEVERE: Exception performing authentication
    java.sql.SQLException: You have an error in your SQL syntax; 
    check the manual that corresponds to your MySQL server version 
    for the right syntax to use near 'null WHERE login = 'user1'' at line 1
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2928)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1571)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1666)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2994)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:936)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1030)
at org.apache.catalina.realm.JDBCRealm.getRoles(JDBCRealm.java:640)
at org.apache.catalina.realm.JDBCRealm.authenticate(JDBCRealm.java:430)
at org.apache.catalina.realm.JDBCRealm.authenticate(JDBCRealm.java:355)
at org.apache.catalina.realm.CombinedRealm.authenticate(CombinedRealm.java:146)
at org.apache.catalina.realm.LockOutRealm.authenticate(LockOutRealm.java:180)
at org.apache.catalina.authenticator.FormAuthenticator.authenticate(FormAuthenticator.java:282)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:440)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:851)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:278)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:636)

ユーザー名の周りの''に注意してください...これは正しいですか?

ご覧のとおり、私もallRolesMode="authOnly"この機能を必要としないため、データベースにはユーザーロール用の追加の列がなく、今後もありません(すべてのユーザーが使用するよりも使用しない場合は、まったく意味がありません)。この列には同じ値があります-頼りになるのは大きな無駄です。)

サーバーはTomcat7.0.19です。

4

2 に答える 2

1

userRoleTableの場合も、roleNameColプロパティを設定する必要がありallRolesMode="authOnly"ます。それらがないと、SQLクエリに文字列が含まnullれます(例外のメッセージでわかるように)。の値はuserRoleTable、の値と同じである可能性があり、userTableまた、とroleNameCol同じである可能性がありますuserNameCol

roles簡単な回避策は、テーブルをエミュレートするSQLビューを作成することです。

CREATE VIEW roles (username, role)
AS SELECT username, 'user' FROM users;

そして解決策:

<Realm className="org.apache.catalina.realm.JDBCRealm" 
    driverName="com.mysql.jdbc.Driver" 
    connectionURL="jdbc:mysql://127.0.0.1:3306/test" 
    connectionName="..." connectionPassword="..." 
    userTable="users" userNameCol="username" userCredCol="password" 
    userRoleTable="users" roleNameCol="username"
/> 

(驚くべきことに、それは何もなしで動作しますallRolesMode。)

必要なweb.xmlスニペット:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>protected zone</web-resource-name>
        <url-pattern>/prot/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
</security-constraint>

<security-role>
     <role-name>*</role-name>
</security-role>

(注:100万人のユーザーがいるとすると、users100万文字列のテーブルの新しい属性のuser\0コストは約5メガバイトになります。これは美しいソリューションではありませんが、今日では耐えられないほど大きくはないことに同意します。)

于 2011-10-19T22:52:06.937 に答える
0

Tomcat 7.0.27.0JDK 1.6

私は認証と認証にのみTomcatを使用していますnot for authorization

以下はセットアップです

context.xml

<Realm className="org.apache.catalina.realm.JDBCRealm"  
       connectionName="login"  
       connectionPassword="password"    
       connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:authdb"    
       driverName="oracle.jdbc.OracleDriver"        
       userTable="appusers"  
       userNameCol="username"              
       userCredCol="password"  
       allRolesMode="authOnly"/>  

web.xml

<security-constraint>  
    <web-resource-collection>  
        <web-resource-name>Protected Area</web-resource-name>  
        <url-pattern>/modules/*</url-pattern>  
        <url-pattern>/index.jsp</url-pattern>  
    </web-resource-collection>  
    <auth-constraint>
        <role-name>*</role-name>    
    </auth-constraint>
</security-constraint>     
<!--
security-role>
    <role-name>user</role-name>
security-role>
-->

<security-role>web.xmlからブロックを削除し、
role auth-contraint-nameを次のように配置することで機能しました。*

auth-contraintブロックを削除するとsecurity-contraint、Webコンテキスト認証自体は呼び出されません!!

于 2013-01-17T11:09:27.237 に答える