gpt4 book ai didi

java - 在 Tomcat 6.0 上使用角色设置客户端证书身份验证

转载 作者:行者123 更新时间:2023-11-28 23:07:57 24 4
gpt4 key购买 nike

我正在设置一个使用客户端证书身份验证的 Web 应用程序。目前,我刚刚设置了一个测试用户帐户和一个“用户”角色来测试身份验证和授权。我正在使用这样配置的 DataSourceRealm 和 postgreSQL 数据库:

<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/postgres" localDataSource="true"
userTable="users" userNameCol="username" userCredCol="password"
userRoleTable="user_roles" roleNameCol="role" />

<Resource auth="Container" type="javax.sql.DataSource" name="jdbc/postgres"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/test"
maxActive="100" maxIdle="30" maxWait="-1"
username="test" password="test" />

当我第一次设置数据库和应用程序时,我在 web.xml 中使用了 FORM 身份验证和以下配置:

<security-constraint>
<web-resource-collection>
<web-resource-name>Test</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>

<auth-constraint>
<role-name>user</role-name>
</auth-constraint>

<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/login-failed.jsp</form-error-page>
</form-login-config>
</login-config>

数据库包含用户:testuser 并分配了角色:user。使用 FORM 身份验证登录按预期工作。

然后我将 FORM 身份验证方法更改为 CLIENT-CERT 并设置必要的证书、CA 等。server.xml 中的连接器配置如下:

   <Connector SSLEnabled="true" clientAuth="true"
maxThreads="150" port="8443" protocol="HTTP/1.1" scheme="https"
keystoreFile="C:\Workspace\Test\keystore.jks"
keystorePass="changeit"
truststoreFile="C:\Workspace\Test\truststore.jks"
truststorePass="changeit"
secure="true" sslProtocol="TLS"/>

用户在数据库中被标识为“CN=testuser,O=Internet Widgits Pty Ltd,ST=Some-State,C=AU”

如果我离开 auth-constraint 指定“用户”角色,我会在访问任何页面时收到 403 权限被拒绝错误。看起来身份验证成功,但它无法从数据库中确定用户的角色。如果我注释掉 auth-constraint,则身份验证成功,我可以访问 protected 页面。

看起来它无法在数据库中查找用户的角色,尽管我在数据库中唯一更改的是用户名的表示方式。验证后如下代码:

X500Principal p = certs[0].getSubjectX500Principal();
out.println (p.getName());

生成“CN=testuser,O=Internet Widgits Pty Ltd,ST=Some-State,C=AU”,这是存储在数据库用户名列中的值,它也映射到用户角色表。

test=> select * from users;
username | password
-----------------------------------------------------------+----------
CN=testuser,O=Internet Widgits Pty Ltd,ST=Some-State,C=AU |
(1 row)

test=> select * from user_roles;
username | role
-----------------------------------------------------------+------
CN=testuser,O=Internet Widgits Pty Ltd,ST=Some-State,C=AU | user
(1 row)

我还应该做什么才能查找用户角色?从我到目前为止所看到的一切来看,这看起来应该可行。感谢您的帮助。

最佳答案

我找到了问题的答案。

虽然

X500Principal p = certs[0].getSubjectX500Principal();
out.println (p.getName());

将主题 DN 返回为“CN=testuser,O=Internet Widgits Pty Ltd,ST=Some-State,C=AU”,打开 DB 上的详细日志记录显示“CN=testuser, O=Internet Widgits Pty Ltd , ST=Some-State, C=AU"(在字段之间插入空格)被提交到查询中的数据库。

LOG:  ... execute <unnamed>: SELECT null FROM users WHERE username = $1
parameters: $1 = 'CN=testuser, O=Internet Widgits Pty Ltd, ST=Some-State, C=AU'
LOG: ... execute <unnamed>: SELECT role FROM user_roles WHERE username = $1
parameters: $1 = 'CN=testuser, O=Internet Widgits Pty Ltd, ST=Some-State, C=AU'

似乎 X509Principal.getName() 返回 getName(X500Principal.RFC2253) tomcat 似乎正在使用 getName(X500Principal.RFC1779) .更新数据库以使用 RFC 1779 格式解决了我的问题。

关于java - 在 Tomcat 6.0 上使用角色设置客户端证书身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5086457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com