Как использовать соль из поля базы данных в Spring Security - PullRequest
3 голосов
/ 09 марта 2012

Я использую spring-security-3.1.0 с spring-framework-3.0.6.Для проверки безопасности входа я использую соль. Но возникли проблемы с использованием соли в источнике соли.если я использую beans: property name = "userPropertyToUse" value = "username", то все в порядке, но возникают проблемы в <beans:property name="userPropertyToUse" value="lalt">, даже если я настроил все необходимые настройки для "salt".Оно высевает это сообщение Невозможно найти солевой метод на пользовательском объекте.Есть ли в классе org.springframework.security.core.userdetails.User метод или метод получения с именем 'salt'?

Мой spring-security.xml выглядит следующим образом

<beans:bean id="saltSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource">
    <beans:property name="userPropertyToUse" value="salt" />
</beans:bean> 
<beans:bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"/>

<beans:bean id="loggerListener" class="org.springframework.security.authentication.event.LoggerListener" /> 

<authentication-manager>
    <authentication-provider user-service-ref="jdbcUserService">
        <password-encoder ref="passwordEncoder">
            <salt-source ref="saltSource"/>
        </password-encoder> 
    </authentication-provider>
</authentication-manager> 

<beans:bean id="jdbcUserService" class="controllers.CustomJdbcDaoImpl">
    <beans:property name="dataSource" ref="dataSource"/>
    <beans:property name="usersByUsernameQuery">
        <beans:value>SELECT U.userid AS username, 
            U.userpassword as password, 
            'true' AS enabled,
            U.userpasswordsalt AS salt 
            FROM users U WHERE U.userid=?
        </beans:value>
    </beans:property>
    <beans:property name="authoritiesByUsernameQuery">
        <beans:value>SELECT U.userid AS username,
            U.userrole as authority 
            FROM users U 
            WHERE U.userid=?
        </beans:value>
    </beans:property>
</beans:bean> 

Мой jdbcUserService.java для соли -

public class CustomJdbcDaoImpl extends JdbcDaoImpl {
    @Override
    protected List<UserDetails> loadUsersByUsername(String username) {
        return getJdbcTemplate().query(getUsersByUsernameQuery(),new String[] {username},
            new RowMapper<UserDetails>() {
                public UserDetails mapRow(ResultSet rs, int rowNum)throws SQLException {
                    String username = rs.getString(1);
                    String password = rs.getString(2);
                    boolean enabled = rs.getBoolean(3);
                    String salt = rs.getString(4);
                    System.out.println("CustomJdbcDaoImpl Salt : "+salt);
                    return new SaltedUser(username, password,enabled, true, true, true,AuthorityUtils.NO_AUTHORITIES, salt);
                }
            });
    } 
}

А Мой SaltedUser.java -

public class SaltedUser extends User{
    private String salt;
    public SaltedUser(String username, String password,boolean enabled,
            boolean accountNonExpired, boolean credentialsNonExpired,
            boolean accountNonLocked, List<GrantedAuthority>authorities, String salt) {
        super(username, password, enabled,accountNonExpired, credentialsNonExpired,accountNonLocked, authorities);
        this.salt = salt;
        System.out.println("SaltedUser Salt : "+salt);
    }

    public String getSalt() {
        return salt;
    }

    public void setSalt(String salt) {
        this.salt = salt;
    }
}

Любой может мне помочь ....?

1 Ответ

1 голос
/ 09 марта 2012

Вам необходимо переопределить метод createUserDetails, который создает окончательную реализацию UserDetails, возвращаемую классом.Посмотрите на источник для JdbcDaoImpl.

Обратите внимание, что если вы не создаете это для устаревшей системы, в которой уже есть система хеширования паролей, то используйте что-то вроде BCrypt для кодирования ваших паролей будет лучше и проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...