#java #spring #spring-security
#java #spring #spring-безопасность
Вопрос:
я надеюсь, что это легко исправить,
чего я хотел бы достичь, так это использовать один логин как для пользователей, так и для администраторов
вот что у меня в настоящее время есть в applicationContext-security.xml файл:
<authentication-manager alias="authenticationManager">
<!-- DAO Based Security -->
<authentication-provider>
<password-encoder hash="sha-256" />
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="SELECT A.user_name AS username, A.consumer_password AS password, A.enabled AS enabled FROM consumer A where A.user_name=?"
authorities-by-username-query="SELECT A.username as username, A.password as password, R.name as authority FROM admin A, roles R WHERE A.roles=R.id AND A.username=?"/>
</authentication-provider>
</authentication-manager>
вход в систему работает нормально для любого пользователя, но я не могу войти ни с одной из учетных записей администратора
возврат sql для учетной записи администратора:
---------- ------------------------------------------------------------------ -----------
| username | password | authority |
---------- ------------------------------------------------------------------ -----------
| admin | 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 | ADMIN |
---------- ------------------------------------------------------------------ -----------
возврат sql для учетной записи пользователя:
---------- ------------------------------------------------------------------ ---------
| username | password | enabled |
---------- ------------------------------------------------------------------ ---------
| adam | 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 | |
---------- ------------------------------------------------------------------ ---------
Ответ №1:
Если я правильно понимаю, учетные записи потребителей хранятся в consumer
таблице, а администраторы — в admin
таблице. Почему вы ожидаете, что администраторы смогут входить в систему, если users-by-username-query
вы запрашиваете только consumers
таблицу, а не admin
таблицу?
Я думаю, что самый простой способ добиться этого — хранить как клиентов, так и администраторов в одной таблице (скажем user
). Затем вы можете запросить эту таблицу в users-by-username-query
, чтобы проверить, существует ли пользователь для этого входа (неважно, клиент или администратор), а затем проверить, является ли пользователь клиентом или администратором, запросив roles
таблицу в authorities-by-username-query
.
Допустим, roles
таблица может выглядеть примерно так:
---------- ------------------------------------------------------------------
| username | role
---------- ------------------------------------------------------------------
| adam | customer
---------- ------------------------------------------------------------------
| admin | admin
---------- ------------------------------------------------------------------
Затем вы можете в любое время запросить Spring Security, является ли текущий зарегистрированный пользователь клиентом или администратором (см. http://static.springsource.org/spring-security/site/docs/3.1.x/reference/technical-overview.html#core-components , раздел: Получение информации о текущем пользователе).