我有一个简单的应用程序,可以在其中注册用户并对其进行身份验证。我已经使用编码了密码,并且能够成功对其进行身份验证。我在我的应用程序中使用Spring
3,Spring Security 3和Hibernate 3。
现在,我想用用户ID对他们的密码加盐,但是我无法实现此功能。有人可以帮我实现吗?我已经尝试了一段时间,但无法完成它。
这是我为用户添加ID并对其进行身份验证的代码。
xyz-security.xml
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/welcome.do" access="hasRole('ROLE_USER')" />
<form-login login-page="/login.do" authentication-failure-url="/login.do?login_error=1"/>
<logout invalidate-session="true" logout-url="/logout" logout-success-url="/"/>
</http>
<beans:bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<beans:property name="userDetailsService" ref="userDetailsService"/>
</beans:bean>
<beans:bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager">
<beans:property name="providers">
<beans:list>
<beans:ref local="daoAuthenticationProvider" />
</beans:list>
</beans:property>
</beans:bean>
<authentication-manager>
<authentication-provider user-service-ref="userDetailsService">
<password-encoder ref="passwordEncoder">
<salt-source ref="saltSource"/>
</password-encoder>
</authentication-provider>
</authentication-manager>
<!-- For hashing and salting user passwords -->
<beans:bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"/>
<beans:bean id="saltSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource"
p:userPropertyToUse="id"/>
UserDetailsAdapter.java
@Service("userDetailsAdapter")
public class UserDetailsAdapter {
private Long id;
org.springframework.security.core.userdetails.User buildUserFromUserEntity(User userEntity) {
String username = userEntity.getUsername();
String password = userEntity.getPassword();
boolean enabled = userEntity.isEnabled();
boolean accountNonExpired = true;
boolean credentialsNonExpired = true;
boolean accountNonLocked = true;
Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
for (String authority: userEntity.getAuthorities()) {
authorities.add(new GrantedAuthorityImpl(authority));
}
this.id = userEntity.getId();
org.springframework.security.core.userdetails.User user = new org.springframework.security.core.userdetails.User(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
return user;
}
public Long getId() {
return id;
}
}
UserDetailsServiceImpl
@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserDao userDao;
@Autowired
private UserDetailsAdapter userDetailsAdapter;
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
UserDetails userDetails = null;
User userEntity = userDao.findByUsername(username);
if (userEntity == null) {
throw new UsernameNotFoundException("user not found");
}
userDetails = userDetailsAdapter.buildUserFromUserEntity(userEntity);
return userDetails;
}
}
UserServiceImpl
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private SaltSource saltSource;
public User getByUsername(String username) {
return userDao.findByUsername(username);
}
public User getByEmail(String email) {
return userDao.findByEmail(email);
}
public void createUser(User user) {
userDao.create(user);
UserDetailsAdapter userDetailsAdapter = new UserDetailsAdapter();
org.springframework.security.core.userdetails.User userDetails = userDetailsAdapter.buildUserFromUserEntity(user);
String password = userDetails.getPassword();
Object salt = saltSource.getSalt(userDetails);
user.setPassword(passwordEncoder.encodePassword(password, salt));
userDao.update(user);
}
public void updateUser(User user) {
userDao.update(user);
}
}
有人可以帮助我了解我在这里想念的东西吗?非常感谢。
ReflectionSaltSource
从的实例中提取盐UserDetails
。但是,您将其org.springframework.security.core.userdetails.User
用作的实现UserDetails
,并且它没有名为的属性id
(而不是您在中具有此属性UserDetailsAdapter
,这是没有意义的,因为UserDetailsAdapter
它是单例的)。
因此,您需要创建一个org.springframework.security.core.userdetails.User
with
id
属性的子类,然后从中返回它UserDetailsAdapter
。
我对Spring和SpringSecurity很陌生。我的数据库中有一个表,其中存储了用户及其密码。(Postgresql数据库)。每次当我在我的表中插入一个新记录时,我都有一个触发器,它使用md5算法加密密码。在我的应用程序中,我使用了Spring,我也尝试使用SpringSecurity3.2模块。我提供了自己的服务。问题是我不知道该怎么做才能在这种情况下使身份验证成功。我认为spring由于
当您在创建过程时,您可以在这个对话框中输入要应用到压缩文件中的密码。输入的密码只会对单个的当前压缩操作有用,如果您需要改变整体的密码时,您必须使用 文件菜单 的“设置默认密码”命令来输入它。 如果“显示密码”选项是禁用的话,您将被要求输入密码两次,以确认是否正确。 如果您设置了“加密文件名”选项, WinRAR 不只加密数据,而且加密所有包括文件数据、文件名、大小、属性、注释和其它块等所有可感知的
我们已经为 name 和 email 字段添加了验证规则,现在要加入用户所需的最后一个常规属性:安全密码。每个用户都要设置一个密码(还要二次确认),数据库中则存储经过哈希加密后的密码。(你可能会困惑。这里所说的“哈希”不是 4.3.3 节介绍的 Ruby 数据结构,而是经过不可逆哈希算法计算得到的结果。)我们还要加入基于密码的认证验证机制,第 8 章会利用这个机制实现用户登录功能。 认证用户的方法
我遇到的问题是,我得到错误“There is no PasswordEncoder mapped for The id”null“”。我读过springsecurity如何不允许密码为纯文本(我理解这是为了安全措施),但问题是我真的不知道如何修复这个错误 和
问题内容: 我已经以加密格式将用户密码存储在数据库中。但是,现在,当用户想要登录并尝试输入其原始密码时,该代码始终会将输入的(原始)密码与数据库中存储的加密版本进行比较,从而导致登录失败。 请告诉我如何比较输入的(原始)密码和存储在数据库中的加密密码。 问题答案: 几乎可以肯定,您应该对密码进行 哈希处理 ,而不是使用可逆加密。您可能还需要 用盐 来做…在这种情况下,正确的步骤是: 查找最初对密码
在FTPS中,密码在尝试通过internet连接服务器时被加密。这就是我所理解的,如果我的理解有任何遗漏,请更正。我的问题是,当我厌倦了模拟它(FTPs和FTP)时,我只是得到一条消息,说SSL已经建立(以及基于隐式和显式调用的端口更改)。 是否有任何其他方式来确认密码是真正加密的,或者我们可以看到密码时,它的普通FTP。下面是我在服务器端看到的日志 启用FTP时的服务器日志- 状态:TLS/SS