Вы должны установить свойства userRoleTable
и roleNameCol
в случае allRolesMode="authOnly"
тоже. Без них SQL-запрос будет содержать String null
(как вы можете видеть в сообщении об исключении). Значение userRoleTable
может быть таким же, как значение userTable
, а roleNameCol
также может быть таким же, как userNameCol
.
Простой обходной путь - создание представления SQL, эмулирующего таблицу roles
:
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>
(Примечание: допустим, у вас 1 миллион пользователей, новый атрибут в таблице users
с одной строкой миллиона user\0
будет стоить всего около 5 мегабайт. Я согласен с тем, что это не красивое решение, но оно не невыносимо большой в наше время.)