On Thu, Aug 28, 2025 at 4:46 PM Christopher Schultz <
ch...@christopherschultz.net> wrote:

> Zoran,
>
> On 8/27/25 5:01 PM, Zoran Avtarovski wrote:
> > Really helped to know where the issue had changed.
>
> You might be able to fix this issue very quickly using this ALTER
> statement:
>
> ALTER TABLE user
> MODIFY COLUMN user_name varchar(255) NOT NULL <-- double-check this
> COLLATE utf8mb4_general_nopad_ci <-- Here is the magic
>

 I would go with one of the three:
1) utf8mb4_0900_ai_ci (Alias for utf8mb4_uca1400_nopad_ai_ci) ("ai" means
accent insensitive. "ci" means case insensitive)
2) utf8mb4_0900_as_ci (Alias for utf8mb4_uca1400_nopad_as_ci )
3) utf8mb4_0900_as_cs (Alias for utf8mb4_uca1400_nopad_as_cs) .
The above mentioned collations are based on one of the latest versions of
unicode, 14 <https://www.unicode.org/versions/Unicode14.0.0/>. (Current
latest version is 16, but is not available in MariaDB.)
 Citing https://dev.mysql.com/doc/refman/8.4/en/charset-unicode-sets.html ,
"comparisons for the utf8mb4_general_ci collation are faster, but slightly
less correct, than comparisons for utf8mb4_unicode_ci".

;
>
> Once you do that, a SELECT with user_name=? won't match strings with
> trailing spaces.
>
> Hope that helps,
> -chris
>
> > On 27/8/2025 10:12 pm, Dimitris Soumis wrote:
> >> On Wed, Aug 27, 2025 at 2:56 AM Zoran Avtarovski
> >> <zo...@sparecreative.com>
> >> wrote:
> >>
> >>> Hi Guys,
> >>>
> >>> We are seeing a strange issue with user logins. If a user includes
> extra
> >>> spaces in their username the login process is successful, but the
> >>> request username from request.getRemoteUser() still has the extra space
> >>> which is causing issues with our internal processes.
> >>>
> >>> Ideally we'd like to change the setup to fail the login if extra spaces
> >>> are included. I've included our current config, and appreciate any help
> >>> in addressing this.
> >>>
> >>> This is all using Tomcat 9 with Java 11 and I have included our config
> >>> below.
> >>>
> >>> Thanks
> >>>
> >>> Zoran
> >>>
> >>> /META-INF/context.xml
> >>>
> >>> <Resource
> >>>           name="jdbc/appDB"
> >>>           type="javax.sql.DataSource"
> >>>           auth="Container"
> >>>           driverClassName="org.mariadb.jdbc.Driver"
> >>>
> >>> url="jdbc:mariadb://localhost:3306/app_db?
> >>>
> useEncoding=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull"
> >>>           username="user"
> >>>           password="password"
> >>>           maxActive="100"
> >>>           maxIdle="30"
> >>>           maxWait="10000"
> >>>           removeAbandoned="true"
> >>>           removeAbandonedTimeout="60"
> >>>           logAbandoned="true"
> >>>           testOnBorrow="true"
> >>>           validationQuery="select count(*) from tableXX"
> >>>       />
> >>>
> >>> <Realm className="org.apache.catalina.realm.LockOutRealm">
> >>>           <Realm className="org.apache.catalina.realm.DataSourceRealm"
> >>>                  dataSourceName="jdbc/appDB"
> >>>                  localDataSource="true"
> >>>                  roleNameCol="status"
> >>>                  userCredCol="password"
> >>>                  userNameCol="user_name"
> >>>                  userRoleTable="users"
> >>>                  userTable="users"
> >>>           >
> >>>               <CredentialHandler
> >>> className="org.apache.catalina.realm.MessageDigestCredentialHandler"
> >>>                   algorithm="SHA"
> >>>                   iterations="1"
> >>>                   saltLength="0"
> >>>               />
> >>>           </Realm>
> >>>       </Realm>
> >>>
> >>> /WEB-INF/web.xml
> >>>
> >>>       <security-constraint>
> >>>           <display-name>Admin Console</display-name>
> >>>           <web-resource-collection>
> >>>               <web-resource-name>Restricted Access</web-resource-name>
> >>>               <!-- Define the context-relative URL(s) to be protected
> >>> -->
> >>>               <description/>
> >>>               <url-pattern>/protected/*</url-pattern>
> >>>           </web-resource-collection>
> >>>           <auth-constraint>
> >>>               <!-- Anyone with one of the listed roles may access this
> >>> area -->
> >>>               <role-name>1</role-name>
> >>>           </auth-constraint>
> >>>       </security-constraint>
> >>>
> >>> <login-config>
> >>>           <auth-method>FORM</auth-method>
> >>>           <realm-name>App</realm-name>
> >>>           <form-login-config>
> >>> <form-login-page>/login.jsp</form-login-page>
> >>> <form-error-page>/login-error.jsp</form-error-page>
> >>>           </form-login-config>
> >>>       </login-config>
> >>>
> >>>
> >>>
> >>> ---------------------------------------------------------------------
> >>> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> >>> For additional commands, e-mail: users-h...@tomcat.apache.org
> >>>
> >>>
> >> Hi Zoran,
> >>
> >> The issue arises from the semantics of the MariaDB database and is not a
> >> defect in Tomcat. By default MariaDB uses PAD collations, which means
> >> that
> >> trailing whitespace will be ignored. When the call to
> >> request.getRemoteUser() is being made, the container correctly returns
> >> the
> >> name associated with the current session, which is the username with the
> >> trailing space.
> >>
> >> Possible solutions for this would be:
> >> 1) Changing the default MariaDB Collation to NO PAD or binary. See
> >> Changing
> >> Default Collation
> >> <https://mariadb.com/docs/server/reference/data-types/string-data-
> >> types/character-sets/setting-character-sets-and-collations#changing-
> >> default-collation>
> >> .
> >> 2) On Tomcat's side, implementing a custom Realm extending
> >> DataSourceRealm
> >> and enforcing that username doesn't contain leading or trailing
> >> whitespace.
> >>
> >> Kind regards,
> >> Dimitris Soumis
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> > For additional commands, e-mail: users-h...@tomcat.apache.org
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: users-h...@tomcat.apache.org
>
>

Reply via email to