在 Spring Security 中使用配置文件名称或电子邮件登录

Posted

技术标签:

【中文标题】在 Spring Security 中使用配置文件名称或电子邮件登录【英文标题】:Logging in with either profile name or email in Spring Security 【发布时间】:2014-05-17 17:36:10 【问题描述】:

我有一个用户 bean,其中包含 userName、profileName、email 等字段。

我正在我的应用程序中实现 Spring Security。在登录表单中,我希望用户输入 profileName 或电子邮件,他应该能够同时登录。但似乎该配置仅适用于用户名。我正在使用休眠从数据库中获取用户详细信息。 下面是我的代码

FormLogin.jsp

<form name='f' action="<c:url value='j_spring_security_check' />"
        method='POST'>

        <table>
            <tr>
                <td>Email/ProfileName</td>
                <td><input type='text' name='j_username' value=''>
                </td>
            </tr>
            <tr>
                <td>Password:</td>
                <td><input type='password' name='j_password' />
                </td>
            </tr>
            <tr>
                <td colspan='2'><input name="submit" type="submit"
                    value="submit" />
                </td>
            </tr>
            <tr>
                <td colspan='2'><input name="reset" type="reset" />
                </td>
            </tr>
        </table>

    </form> 

CustomUserDetailsS​​ervice 类中的 loadByUserName 方法

public UserDetails loadUserByUsername(String name)throws UsernameNotFoundException, DataAccessException 
    

        //returns the get(0) of the user list obtained from the db
        User domainUser = userDAO.getUser(name);
        logger.info("User fetched from database in loadUserByUsername method " + domainUser);

        Set<Roles> roles = domainUser.getRole();
        logger.info("roles of the user"+ roles);


        Set<GrantedAuthority> authorities = new HashSet<>();
        for(Roles role:roles) 
            authorities.add(new SimpleGrantedAuthority(role.getRole()));
            logger.info("role" +role+" role.getRole()"+(role.getRole()));
        

        return new org.springframework.security.core.userdetails.User(
                domainUser.getName(),
                domainUser.getPassword(),
                domainUser.isEnabled(),
                domainUser.isAccountNonExpired(),
                domainUser.isCredentialsNonExpired(),
                domainUser.isAccountNonLocked(),
                authorities);

从数据库查询

@SuppressWarnings("unchecked")
    public User getUser(String name)

        List<User> userList = new ArrayList<User>(); 
        Query query = sessionFactory.getCurrentSession().createQuery("from User u where u.name = :name");
        query.setParameter("name", name);
        userList = query.list();  
        if (userList.size() > 0)  
            return userList.get(0);  
        else  
            return null; 
    

谁能帮忙解决这个问题?

spring-security.xml

<http auto-config="true">
        <intercept-url pattern="/forms/welcome*" access="ROLE_ADMIN" />
        <!-- Below config will display the custom form for authentication -->
        <form-login login-page="/forms/login" default-target-url="/forms/welcome"
            authentication-failure-url="/forms/loginfailed" />
        <logout logout-success-url="/forms/logout" />
    <!--    <http-basic /> -->
    </http> 


    <authentication-manager>
        <authentication-provider user-service-ref="myUserDetailService">
          </authentication-provider>
    </authentication-manager>

【问题讨论】:

【参考方案1】:

您没有发布您的安全配置。我假设您已经使用DaoAuthenticationProvider 设置了标准配置,并且您已经能够使用用户名登录。

在这种特殊情况下,我只看到一项修改以允许使用用户名或电子邮件登录。将or 谓词添加到您的休眠查询中,该查询也通过电子邮件查询用户。我假设您的实体有一个属性email

"from User u where u.name = :name or u.email = :name"

【讨论】:

我现在添加了安全配置 太棒了。很高兴听到这个消息。

以上是关于在 Spring Security 中使用配置文件名称或电子邮件登录的主要内容,如果未能解决你的问题,请参考以下文章

可以使用 Spring Security 实时加载自定义配置文件吗?

spring security 使用hibernate和jsf认证不同的配置文件和权限

spring security 和auth2.0的区别

如何为密钥持有者配置文件配置 Spring Security SAML 扩展

Spring + Hibernate + Spring Security 配置

在 Grails Spring Security Core 插件中配置会话超时,无需修改“War”