tomcat - JDBC Realm 身份验证不会立即检测到密码更改

标签 tomcat jetty jdbcrealm

我正在使用 JdbcRealm 为我的 Web 应用程序提供基于 FORM 的身份验证,它是使用 JSF 创建的。我创建了一个用于用户管理的网页。问题是当用户更改密码时,jdbcRealm 不会立即反射(reflect)更改,而是重定向到错误页面。

我正在使用具有以下配置的 Jetty 插件进行开发:

web.xml

  <login-config>
        <auth-method>FORM</auth-method>
        <realm-name>RealmName</realm-name>
          <form-login-config> 
             <form-login-page>/login.xhtml</form-login-page> 
             <form-error-page>/access-denied.xhtml</form-error-page> 
         </form-login-config> 
    </login-config>
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>secured</web-resource-name>
            <description/>
            <url-pattern>/views/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>USER</role-name>
            <role-name>ADMINISTRATOR</role-name>
        </auth-constraint>
    </security-constraint> 

pom.xml

<plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.3.7.RC1</version>
                <configuration>
                    <scanIntervalSeconds>10</scanIntervalSeconds>
                    <webApp>
                        <contextPath>/ROOT</contextPath>
                    </webApp>
                    <dumpOnStart>true</dumpOnStart>
                    <loginServices>
                        <loginService implementation="org.eclipse.jetty.security.JDBCLoginService">
                            <name>RealmName</name>
                            <config>${project.basedir}/src/main/resources/realm.properties</config>
                        </loginService>
                    </loginServices>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.38</version>
                    </dependency>
                    <dependency>
                        <groupId>c3p0</groupId>
                        <artifactId>c3p0</artifactId>
                        <version>0.9.1.2</version>
                    </dependency>
                </dependencies>
            </plugin>

realm.properties

jdbcdriver = com.mysql.jdbc.Driver
url = urlOfMyDatabase
username = myUser
password = myPassword

usertable = table
usertablekey = id_user
usertableuserfield = username
usertablepasswordfield = password

roletable = role
roletablekey = id_role
roletablerolefield = name

userroletable = user
userroletableuserkey = id_user
userroletablerolekey = role_id
cachetime = 300

我猜是因为缓存时间,但是当我执行用户修改时,如何维护缓存并刷新它?。

以下配置适用于我的开发环境,对于生产环境,我使用的是具有以下配置的 Tomcat:

<Realm className="org.apache.catalina.realm.JDBCRealm" driverName="com.mysql.jdbc.Driver" localDataSource="true" connectionURL="urlOfMyDatabase" connectionName="myUser" connectionPassword="myPassword" userTable="user_view" userNameCol="username" userCredCol="password" userRoleTable="user_view" roleNameCol="role"/>

我希望你能帮助我:)

最佳答案

我猜密码更改不会在 5 分钟内被接收?检查你的 realm.properties 我是怎么猜到的。提示:查看该文件的末尾,或查看此页面上的 ctrl+f 300

您可能根本不需要任何缓存:许多用户在 5 分钟后再次登录(因此使用缓存)的可能性可能接近于零。因此,此缓存只会消耗您的内存,而不会从中获得任何 yield 。如果对单个记录的简单查找会减慢您的应用程序或数据库的速度,那么您就会遇到另一个问题。摆脱它。

将缓存放在那里而没有任何它有帮助的测量称为过早优化。您会在别处发现过早优化是万恶之源。

关于tomcat - JDBC Realm 身份验证不会立即检测到密码更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35925868/

相关文章:

hibernate - 在 Grails/Tomcat 上的长批处理期间出现 OutOfMemoryError

java - 为什么 Tomcat 服务器不更改复制的 JSF 项目的名称

jsp - 使用 Java EE Form 身份验证登录后访问用户详细信息

java - primefaces 组件未使用数据领域正确呈现

tomcat - 如何为 2 个不同的(用户和管理员)身份验证设置 Tomcat web.xml 和 context.xml

java - 在 TomCat 上没有配置任务执行器的 DirectMessageListenerContainer?

eclipse - 在eclipse中更改启动tomcat的超时

java - 如何为 Jetty9 启用 gzip 压缩(静态和动态)?

spring - Gradle +嵌入式 jetty

character-encoding - Jetty字符编码问题