복붙노트

[SPRING] 봄 보안 인증 로그인에서 사용자 이름과 비밀번호의 사용자 입력 값을 얻는 방법

SPRING

봄 보안 인증 로그인에서 사용자 이름과 비밀번호의 사용자 입력 값을 얻는 방법

내 응용 프로그램에서 Spring MVC를 사용하고 로그인은 봄 보안으로 인증됩니다. 내 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-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'>

이제 사용자가 로그인 양식에 입력 한 비밀번호 값을 loadUserByUsername 메소드 내부에서 가져 오거나 UserServiceImpl.java 클래스에 새 메소드를 추가하여 가져 오려고합니다.

다음을 사용하여 암호를 저장하기 전에 암호를 암호화합니다. Java를 사용하여 암호를 암호화하고 암호를 해독하는 데 사용되는 API 및 알고리즘

그래서 로그인하는 동안 스프링 보안은 사용자가 입력 한 암호를 데이터베이스의 암호화 된 암호와 비교하고 로그인에 실패합니다. 그러나 위의 링크에서 제안 된 구현에 따라 암호와 암호화 된 암호를 비교하여 암호가 같은지 확인하는 방법이 있습니다. 이는 사용자가 입력 한 암호에 대한 액세스 권한을 얻은 경우에만 가능합니다. 이것이 내가 사용자가 입력 한 암호를 얻으려고하는 이유입니다.

해결법

  1. ==============================

    1.MangEngkus의 답변에서 제안한 것처럼 사용자 정의 AuthenticationProvider를 구현할 수 있지만 사용자의 설명에 기반하여 사용자가이를 수행 할 필요가 있다고 생각하지 않습니다.

    MangEngkus의 답변에서 제안한 것처럼 사용자 정의 AuthenticationProvider를 구현할 수 있지만 사용자의 설명에 기반하여 사용자가이를 수행 할 필요가 있다고 생각하지 않습니다.

    스프링 보안에 자신의 암호 해시 메커니즘을 구현할 필요가 없습니다. 스프링 자체에서 BCryptPasswordEncoder를 정의하면됩니다.

    기본 방법을 사용하는 방법은 다음과 같습니다.

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

    또는 자신 만의 빈을 만들어 기본 제공자에게 제공하십시오 :

    <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"/>
    
  2. ==============================

    2.원하는 경우 자신 만의 AuthenticationProvider를 만들 수 있습니다.

    원하는 경우 자신 만의 AuthenticationProvider를 만들 수 있습니다.

    public class CustomAuthenticationProvider implements AuthenticationProvider{
    
        private UserDetailsService service;
    
        @Override
        public Authentication authenticate(Authentication authentication) throws AuthenticationException {
            UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) authentication;
            String username = token.getName();
            String password = token.getCredentials(); // retrieve the password 
            // do something here
    
            // if ok then return the authentication
            return new UsernamePasswordAuthenticationToken(username, password, authorities);
        }
    }
    

    보안 구성에 연결하십시오.

    <beans:bean id="customAuthenticationProvider"
     class="com.xxx.CustomAuthenticationProvider">
      <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="customAuthenticationProvider" />
        </beans:list>
      </beans:property>
    </beans:bean>
    
  3. from https://stackoverflow.com/questions/34931606/how-to-get-the-user-entered-values-of-username-and-password-in-a-spring-security by cc-by-sa and MIT license