如何在spring security authenticated登录中获取用户输入的用户名和密码值
我在我的应用程序中使用Spring MVC,登录通过spring security进行身份validation。 我在UserServiceImpl.java
类中有以下两种方法,public UserDetails loadUserByUsername(String userName)抛出UsernameNotFoundException,DataAccessException {
ApplicationTO applicationTO = null; try { applicationTO = applicationService.getApplicationTO(adminDomainName); } catch (ApplicationPropertyException e) { // TODO Auto-generated catch block e.printStackTrace(); } UserTO userTO = getUserTO(applicationTO.getApplicationId(), userName); if (userTO == null) { throw new UsernameNotFoundException("user not found"); } httpSession.setAttribute("userTO", userTO); return buildUserFromUserEntity(userTO); } User buildUserFromUserEntity(UserTO userTO) { String username = userTO.getUsername(); String password = userTO.getPassword(); int userId = userTO.getUserId(); int applicationId = userTO.getApplicationId(); boolean enabled = userTO.isEnabled(); boolean accountNonExpired = true; boolean credentialsNonExpired = true; boolean accountNonLocked = true; User user = new User(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, getAuthority(applicationId, userId)); return user; }
我对Spring比较陌生,对弹簧安全部分不太了解。 在我的spring-security.xml
文件中,我有以下内容,
我的登录表单的操作设置如下:
现在,我试图获取用户在登录表单中输入的password
值,可以在loadUserByUsername
方法内部,也可以通过向UserServiceImpl.java
类添加新方法。
在保存密码之前,我使用以下内容加密密码。 使用什么API和算法来使用java加密和解密密码
因此,在登录期间,Spring安全性会将用户输入的密码与数据库中的加密密码进行比较,并且登录失败。 但是根据上面链接中建议的实现,有一种方法可以比较密码和加密密码以检查它们是否相同。 只有当我可以访问用户输入的密码时才可以这样做。 这就是我试图让用户输入密码的原因。
正如MangEngkus在回答中建议的那样,您可以实现自己的自定义AuthenticationProvider,但根据您的描述,我认为您不需要这样做。
您不需要在spring-security中实现自己的密码散列机制。 您只需要从spring本身定义BCryptPasswordEncoder 。
这种方式使用默认方式:
或者创建自己的bean并将其提供给默认提供者:
但对你而言,这就是方式::)
如果需要,您可以创建自己的AuthenticationProvider
public class CustomAuthenticationProvider implements AuthenticationProvider{ private UserDetailsService service; @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) authentication; String username = token.getName(); String password = token.getCredentials(); // retrieve the password // do something here // if ok then return the authentication return new UsernamePasswordAuthenticationToken(username, password, authorities); } }
并将其插入您的安全配置