UserDetailsS​​ervice的UserDetails如何比较以html格式通过用户传递的数据

时间:2018-04-23 12:14:04

标签: spring security userdetailsservice

我有:

@Service
public class MyAppUserDetailsService implements UserDetailsService {

@Autowired
private IUserInfoDAO userInfoDAO;

@Override
public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {

    User activeUserInfo                   = userInfoDAO.getActiveUser(userName);
    GrantedAuthority authority            = new SimpleGrantedAuthority(activeUserInfo.getRole());


    String userNameVal                    = activeUserInfo.getUserName();
    String userSurnameVal                 = activeUserInfo.getPassword();

    UserDetails userDetails = new org.springframework.security.core.userdetails.User(userNameVal, userSurnameVal, Arrays.asList(authority));
    return userDetails;
}
}

在我配置的安全链中

   .and().formLogin()  //login configuration
                .loginPage("/app/login")
                .loginProcessingUrl("/app-login")
                .usernameParameter("app_username")
                .passwordParameter("app_password")
                .defaultSuccessUrl("/app/secure/projects-details")

如何将表单中的用户密码填写与loadUserByUsername方法中设置的UserDetails进行比较?

1 个答案:

答案 0 :(得分:1)

一旦告诉Spring安全配置您将使用特定的UserDetailsService或只有一个@Service bean是该接口的实现,那么Spring开始使用它从您的用户名中获取用户持久存储。让我们简化流程:

  1. 用户提交一个表单,其中存在名称为app_usernameapp_password的字段(在Web安全配置中配置)到loginPage(String)路径

  2. 表单提交被Spring Security的过滤链拦截,Spring意识到用户名位于字段app_username中,密码app_password

  3. 字段中
  4. 现在已激活已配置的UserDetailsService bean,调用其loadUserByUsername(String)方法并传递app_username字段的值(例如john_smith

  5. 由于loadUserByUsername(String)方法是按合同设计的,用于返回UserDetails的实现,因此它始终返回包含getUsername()getPassword()方法的对象

  6. Spring然后使用合同中的getPassword()方法并将密码与app_password字段进行比较(例如super_s3cr3t_password

  7. 如果在Spring Security Config中配置了passwordEncoder()或者PasswordEncoder接口的实现被注册为bean,则spring使用isPasswordValid(String, String, Object)方法来验证{的内容{1}}字段和app_password方法

  8. 的结果
  9. 如果UserDetails.getPassword()没有抛出UserDetailsService且被抓取的UsernameNotFoundException UserDetailsgetPassword()匹配,则过滤器链继续执行另一个过滤器,否则会阻止用户登录应用程序

  10. 如果代码示例更好地简化了它,那么想象下面的伪java代码:

    app_password

    请记住,这不是幕后的Spring Security Code,而只是解释的简化代码说明。