Получить пароль текущего пользователя из spring -security
Я использую spring -security с HTTP Basic Auth для защиты java webapp. В моем webapp мне нужно получить текущее имя пользователя и пароль для дальнейшей аутентификации с другой службой. Я могу получить имя пользователя, но не пароль.
Я попытался использовать SecurityContextHolder.getContext().getAuthentication()
для доступа к этой информации, как предлагается здесь Как получить пароль открытого текста из spring -security?, но пароль возвращается как null
.
Как я могу получить пароль?
Спасибо.
Это мой applicationContext-security.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:sec="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<sec:http authentication-manager-ref='authenticationManager'>
<sec:intercept-url pattern="/spring/**" access="ROLE_USER" />
<sec:http-basic />
</sec:http>
<bean id="basicAuthenticationFilter"
class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter">
<property name="authenticationManager" ref="authenticationManager" />
<property name="authenticationEntryPoint" ref="authenticationEntryPoint" />
</bean>
<bean id="authenticationEntryPoint"
class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint">
<property name="realmName" value="Announcements Rest Realm" />
</bean>
<bean id="authenticationManager"
class="org.springframework.security.authentication.ProviderManager">
<property name="providers">
<list>
<ref local="authProvider" />
</list>
</property>
</bean>
<bean id="authProvider"
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<property name="userDetailsService" ref="userDetailsService" />
</bean>
<bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy">
<constructor-arg>
<list>
<sec:filter-chain pattern="/spring/**" filters="basicAuthenticationFilter" />
</list>
</constructor-arg>
</bean>
<sec:user-service id="userDetailsService">
<sec:user name="admin" password="**" authorities="ROLE_USER, ROLE_ADMIN" />
<sec:user name="user" password="**" authorities="ROLE_USER" />
</sec:user-service>
Ответы
Ответ 1
Я понял это.
Я изменил конфигурацию менеджера аутентификации, чтобы использовать элемент управления аутентификацией и добавил туда атрибут:
<sec:authentication-manager alias="authenticationManager" erase-credentials="false">
<sec:authentication-provider ref="authProvider" />
</sec:authentication-manager>
Затем я могу использовать SecurityContextHolder.getContext().getAuthentication().getCredentials()
в своем классе контроллера, чтобы получить пароль.
Спасибо за вашу помощь, хотя Пиотрек Де
Ответ 2
Используете ли вы помните меня/запускаете как пользователь/переключатель? В этом случае пароль имеет значение null (как описано в потоке, о котором вы упомянули). Кроме того, возможно, вам нужно использовать базовую проверку подлинности (отправьте запрос на j_spring_security_check)
Ответ 3
Если вы задаете всю информацию о текущем пользователе, включая пароль в объекте сеанса, вы можете получить пароль от этого объекта сеанса.
Ответ 4
лучший способ - реализовать свой "userDetailsService". поэтому вы можете контролировать, как UserDetails можно было бы использовать при выполнении проверки подлинности. я реализовал аутентификацию на основе форм и написал свою самоопределяемую службу пользователя,
@Service("userService")
public class UserServiceImpl extends GenericService<User> implements UserDetailsService,UserService{
@Override
@Transactional
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
// Declare a null Spring User
UserDetails userDetails = null;
// Search database for a user that matches the specified username
// You can provide a custom DAO to access your persistence layer
// Or use JDBC to access your database
// DbUser is our custom domain user. This is not the same as Spring User
User dbUser=this.findUserByUserName(username);
if (dbUser == null) {
throw new UsernameNotFoundException("HiMVC Security:: Error in retrieving user(username=" + username + ")");
}
userDetails = new org.springframework.security.core.userdetails.User(
dbUser.getUserName(),
dbUser.getPassword(),//here you can put a clear text password
true,
true,
true,
true,
loadUserAuthorities(username));
return userDetails;
}