[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.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.원하는 경우 자신 만의 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>
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
'SPRING' 카테고리의 다른 글
[SPRING] 여분의 many-to-many 테이블을 생성하는 Hibernate (0) | 2019.04.02 |
---|---|
[SPRING] Spring을 사용하여 개발하는 동안 모든 인증서를 신뢰해야합니다. (0) | 2019.04.02 |
[SPRING] 스프링을 사용하여 전략 패턴을 효율적으로 구현하는 방법은 무엇입니까? (0) | 2019.04.02 |
[SPRING] Hazelcast를 스프링을 사용하는 세션 캐싱에 대해 노드 집합으로 제한하면서 구성하는 방법은 무엇입니까? (0) | 2019.04.02 |
[SPRING] 여러 코어 및 저장소에 Spring Data Solr을 사용하여 사용자 정의 Solr 저장소를 구현하는 방법 (0) | 2019.04.02 |