实现UserDetailsService达成用户名登录和短信登录

来源:4-12 短信登录配置及重构

mjka5632

2018-04-01

@Component
public class MyUserDetailsService implements UserDetailsService {
    private Logger logger= LoggerFactory.getLogger(getClass());
    @Autowired
    private PasswordEncoder passwordEncoder;
    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        TUser user = userRepository.findByUsername(username);
        if (user != null) {
            logger.info("登录用户名:"+user.getUsername());
            logger.info("密码:"+passwordEncoder.encode(user.getPassword()));
            logger.info("User---->{}",user.toString());
            return user;

        }

        user.setUsername("查无此人");


        logger.info("User---->{}",user.toString());
        return user;
    }


}
@Component
public class MobileDetailsService implements UserDetailsService {
    private Logger logger= LoggerFactory.getLogger(getClass());
    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String telPhone) throws UsernameNotFoundException {
        TUser user = userRepository.findByTelPhone(telPhone);
        if (user != null) {
            logger.info("登录用户名:"+user.getUsername());
            logger.info("User---->{}",user.toString());
            return user;

        }

        throw new InternalAuthenticationServiceException("无法获取用户信息");

    }


}
@Configuration
public class SmsCodeAuthenticationSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain,HttpSecurity> {

    @Autowired
    private AuthenticationFailureHandler imoocAuthenticationFailureHandler;

    @Autowired
    private AuthenticationSuccessHandler imoocAuthenticationSuccessHandler;

    @Autowired
//    @Qualifier("mobileDetailsService")
    @Qualifier("mobileDetailsService")
    private UserDetailsService userDetailsService;
@Configuration
public class BrowserSecurityConfig extends AbstractChannelSecurityConfig {
    @Autowired
    private SecurityProperties securityProperties;
    //IDE错误,此处忽略
    @Autowired
    private DataSource dataSource;

    @Autowired
    @Qualifier("myUserDetailsService")
    private UserDetailsService userDetailsService;

现在出现的问题是用户名登录走的不是我自己打的loadUserByUsername()而是InMemoryUserDetailsManager()走到这个类中,请问老师怎么解决这个问题?

写回答

2回答

JoJo

2018-04-02

//img.mukewang.com/szimg/5ac1a72f0001e4df11150311.jpg

如图,在configure方法中,明确的指定使用的userDetailsService接口实现

0
1
mjka5632
非常感谢!
2018-04-02
共1条回复

mjka5632

提问者

2018-04-02

@Configuration
public class BrowserSecurityConfig extends AbstractChannelSecurityConfig {
    @Autowired
    private SecurityProperties securityProperties;
    //IDE错误,此处忽略
    @Autowired
    private DataSource dataSource;

    @Autowired
    @Qualifier("myUserDetailsService")
    private UserDetailsService userDetailsService;

    @Autowired
    private SmsCodeAuthenticationSecurityConfig smsCodeAuthenticationSecurityConfig;

    @Autowired
    private ValidateCodeSecurityConfig validateCodeSecurityConfig;


    /**
     *
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        applyPassowrdAuthenticationConfig(http);
        //导入配置
        http.apply(validateCodeSecurityConfig)
                .and()
        //--------------身份认证
                .apply(smsCodeAuthenticationSecurityConfig)

                .and()
                //记住我功能
                .rememberMe()
                //设置数据库Token
                .tokenRepository(persistentTokenRepository())
                //设置时效
                .tokenValiditySeconds(securityProperties.getBrowser().getRememberMeSeconds())
                //拿到User信息
                .userDetailsService(userDetailsService)
                //basic方式
//          http.httpBasic()
                .and()
                //--------对请求做授权(下面都是对授权的配置)
                .authorizeRequests()
                //这个url无需认证
                .antMatchers(SecurityConstants.DEFAULT_LOGIN_PROCESSING_URL_FORM,
                        SecurityConstants.DEFAULT_UNAUTHENTICATION_URL,
                        securityProperties.getBrowser().getLoginPage(),
                        SecurityConstants.DEFAULT_VALIDATE_CODE_URL_PREFIX+"/*")
                .permitAll()
                //任何请求
                .anyRequest()

                //都需要做身份认证
                .authenticated()
                .and()
                //跨站请求防护
                .csrf().disable()

        ;
    }


0
0

Spring Security技术栈开发企业级认证与授权

Spring Security技术栈,REST风格开发常见接口,独立开发认证授权模块保证REST服务安全

2662 学习 · 1561 问题

查看课程