spring-security 如何使用用户名或邮箱登录

其他文章是介绍使用邮箱以及验证码登录的方式,如果变成如下这种通过用户名或者邮箱的登录方式呢? https://gitee.com/pmh905001/moikiitos/

 

spring-security只实现用了用户名+密码登录,没有邮箱+密码登录的方式该怎么进行扩展呢? 

翻了下源代码,做法如下:在spring-security.xml添加一个能够支持邮箱登录的bean,并且注入到:authentication-manager 下的 authentication-provider 

复制代码
    <beans:bean id="userDetailsManager" class="com.hyxc.moikiitos.services.UserDetailsServiceImpl">
        <beans:property name="dataSource" ref="dataSource" />
    </beans:bean>
    
    <beans:bean id="encoder" class="org.springframework.security.crypto.password.StandardPasswordEncoder"/>
  
    <authentication-manager>
        <authentication-provider user-service-ref="userDetailsManager">
            <password-encoder ref="encoder" />
        </authentication-provider>
    </authentication-manager>
复制代码

 

剩下的事情就是扩展 JdbcUserDetailsManager,只需要覆盖 loadUsersByUsername(String username)方法,让email字段也能作为查询条件即可。代码如下:

复制代码
package com.hyxc.moikiitos.services;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.provisioning.JdbcUserDetailsManager;

public class UserDetailsServiceImpl extends JdbcUserDetailsManager {
    @Override
    protected List<UserDetails> loadUsersByUsername(String username) {
        return getJdbcTemplate().query("select username,password,enabled from users where username = ? or email = ?",
                new String[] { username, 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);
                        return new User(username, password, enabled, true, true, true, AuthorityUtils.NO_AUTHORITIES);
                    }

                });

    }

}
复制代码

 

posted on   pmh905001  阅读(282)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示