如何在Spring Security身份验证登录中让用户输入用户名和密码的值

汤玛士

我在应用程序中使用Spring MVC,并且登录由Spring Security验证。我的UserServiceImpl.java课程中有以下两种方法,公共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安全性部分也不了解。在我的spring-security.xml文件中,我有以下内容,

<form-login login-page="/login" default-target-url="/module/user-home/welcome"
    authentication-failure-url="/login?error" username-parameter="username"
    password-parameter="password" />
<logout logout-success-url="/login?logout" />

<beans:bean id="daoAuthenticationProvider"
 class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
  <beans:property name="userDetailsService" ref="userDetailsService"/>
</beans:bean>

<beans:bean id="authenticationManager"
    class="org.springframework.security.authentication.ProviderManager">
  <beans:property name="providers">
    <beans:list>
      <beans:ref local="daoAuthenticationProvider" />
    </beans:list>
  </beans:property>
</beans:bean>

我的登录表单的操作设置如下:

<form id="loginForm" class="form-horizontal" role="form" name='loginForm' action="${rc.getContextPath()}/j_spring_security_check" method='POST'>

现在,我试图获取password用户在登录表单中输入的值,无论是在loadUserByUsername方法内部还是在UserServiceImpl.java类中添加新方法

在保存密码之前,我使用以下方法对密码进行加密。使用Java用来加密和解密密码的API和算法

因此,在登录期间,spring security将用户输入的密码与数据库中的加密密码进行了比较,登录失败。但是根据上面链接中建议的实现,有一种方法可以比较密码和加密的密码,以检查它们是否相同。仅当我可以访问用户输入的密码时,才有可能。这就是我尝试获取用户输入密码的原因。

吉美

正如MangEngkus的回答所建议的那样,您可以实现自己的自定义AuthenticationProvider,但是根据您的描述,我认为您不需要这样做。

您不需要在spring-security中实现自己的密码哈希机制。您只需要从spring本身定义BCryptPasswordEncoder

可以通过以下两种方式使用默认方式:

<authentication-manager>
  <authentication-provider>
    <password-encoder hash="bcrypt" />
  </authentication-provider>
</authentication-manager>

或创建您自己的bean并将其提供给默认提供程序:

<authentication-manager>
  <authentication-provider>
    <password-encoder ref="encoder" />
  </authentication-provider>
</authentication-manager>

<beans:bean id="encoder" 
  class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
    <beans:constructor-arg name="strength" value="15" />
</beans:bean>

但是对您来说,这就是方法::)

<beans:bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
  <beans:property name="userDetailsService" ref="userDetailsService"/>
  <beans:property name="passwordEncoder" ref="encoder" />
</beans:bean>

<bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我如何使用Spring Security通过ID和密码而不是用户名和密码对用户进行身份验证

如何在Moya中设置基本身份验证用户名和密码?

Spring Security中的身份验证问题(仅检查用户名而不检查密码?)

如果在java spring security 中登录身份验证失败,如何获取anonymousUser 用户名?

如何在控制台中创建登录名,在其中使用存储在文件 c# 中的用户名和密码进行身份验证

如何针对盐和散列的密码和用户名对用户进行身份验证?

Spring Security身份验证仅适用于一个用户名和密码

如何执行我自己的身份验证(检查用户键入的用户名和密码)

如何在Datasnap Server Methods单元中获取经过身份验证的用户名和密码?

如何在Laravel身份验证中处理列的自定义名称,用户名和密码

Laravel 5.2身份验证-如何在每个页面中显示登录用户名和注销链接?

如何使用经过身份验证的用户名和密码离线下载网站?

如何使用用户名和密码对Kubernetes kubectl进行身份验证?

如何使用Java代码设置基本身份验证(用户名和密码)

如何为基本的HTTP身份验证设置用户名和密码?

如何使用node.js中的基本身份验证从URL获取用户名和密码?

如何使uCanAccess使用Samba身份验证以及用户名或密码中的特殊字符?

具有3个字段的Spring Security身份验证,而不仅仅是用户名和密码

如何在.NET Web API 2.0的Controller中获取基本身份验证用户名/密码

在使用 IAP 中的“云身份验证登录”进行身份验证后,如何限制用户仅使用他的用户名(通过该用户名进行身份验证)?

使用nodejs,表达和基本身份验证如何获取用户名和密码

如何仅使用一个字段进行网页身份验证(而不是用户名和密码)

如何使用Python在Selenium中使用用户名和密码对代理进行身份验证

如何解决WSO2中的节俭身份验证异常(错误的用户名或密码)

如何使用spring-security通过用户名和密码登录?

如何使用Python / Selenium设置代理身份验证用户名:密码

如何获取 Azure AD 身份验证用户的用户名和电子邮件

如何在Web API中获取经过身份验证的用户名(基于令牌的身份验证)

使用 Spring security OAUTH2 在授予类型“密码”中获取用户名和密码以进行验证