Получить пароль текущего пользователя из 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;
        }