[SPRING] Spring 보안으로 성공적으로 로그인 한 후 로그인 날짜를 올바르게 업데이트하는 방법은 무엇입니까?
SPRINGSpring 보안으로 성공적으로 로그인 한 후 로그인 날짜를 올바르게 업데이트하는 방법은 무엇입니까?
Spring 3.2.0과 같은 버전의 Spring 보안을 사용하고 있습니다. 로그인에 성공하면 사용자는 다음과 같이 보호 된 페이지 중 하나로 리디렉션됩니다.
public final class LoginSuccessHandler implements AuthenticationSuccessHandler
{
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException
{
Set<String> roles = AuthorityUtils.authorityListToSet(authentication.getAuthorities());
if (roles.contains("ROLE_ADMIN"))
{
response.sendRedirect("admin_side/Home.htm");
return;
}
}
}
나는 최대 절전 모드를 사용하고있다. 로그인 성공시 데이터베이스의 로그인 날짜 - 시간 (마지막 로그인)을 어떻게 업데이트합니까? POST 요청이 해당 로그인 컨트롤러의 메소드에 매핑되지 않는 로그인 페이지에 제출 버튼이 있습니다. 로그인 양식의 작업은 실제로 Servlet - j_spring_security_check에 매핑됩니다.
필요한 경우 전체 spring-security.xml 파일은 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<http pattern="/Login.htm*" security="none"></http>
<http auto-config='true'>
<!--<remember-me key="myAppKey"/>-->
<session-management session-fixation-protection="newSession">
<concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
</session-management>
<intercept-url pattern="/admin_side/**" access="ROLE_ADMIN" requires-channel="any"/>
<form-login login-page="/" default-target-url="/admin_side/Home.htm" authentication-failure-url="/LoginFailed.htm" authentication-success-handler-ref="loginSuccessHandler"/>
<logout logout-success-url="/Login.htm" invalidate-session="true" delete-cookies="JSESSIONID"/>
</http>
<authentication-manager>
<authentication-provider>
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="select email_id, password, enabled from user_table where lower(email_id)=lower(?)"
authorities-by-username-query="select ut.email_id, ur.authority from user_table ut, user_roles ur where ut.user_id=ur.user_id and lower(ut.email_id)=lower(?)"/>
</authentication-provider>
</authentication-manager>
<beans:bean id="loginSuccessHandler" class="loginsuccesshandler.LoginSuccessHandler"/>
<global-method-security>
<protect-pointcut expression="execution(* dao.*.*(..))" access="ROLE_ADMIN"/>
</global-method-security>
<!--<global-method-security secured-annotations="enabled" />-->
</beans:beans>
해결법
-
==============================
1.또 다른 방법은 AuthenticationSuccessEvent에 대한 핸들러를 등록하는 것입니다.
또 다른 방법은 AuthenticationSuccessEvent에 대한 핸들러를 등록하는 것입니다.
@Service public class UserService implements ApplicationListener<AuthenticationSuccessEvent> { @Override public void onApplicationEvent(AuthenticationSuccessEvent event) { String userName = ((UserDetails) event.getAuthentication(). getPrincipal()).getUsername(); User user = this.userDao.findByLogin(userName); user.setLastLoginDate(new Date()); } }
-
==============================
2.인증 성공 처리기에서 직접하지 않는 이유는 무엇입니까?
인증 성공 처리기에서 직접하지 않는 이유는 무엇입니까?
public final class LoginSuccessHandler implements AuthenticationSuccessHandler { @Autowired private UserService userService; @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { String userName = authentication.getPrincipal().getName(); this.userService.updateLastLoginDateForUserByName(userName); Set<String> roles = AuthorityUtils.authorityListToSet(authentication.getAuthorities()); if (roles.contains("ROLE_ADMIN")) { response.sendRedirect("admin_side/Home.htm"); return; } } }
-
==============================
3.Spring AuthenticationProvider 인터페이스를 서브 클래스 화하여
요소에 삽입 할 수도 있습니다. Spring AuthenticationProvider 인터페이스를 서브 클래스 화하여
요소에 삽입 할 수도 있습니다. 수업은 다음과 같이 될 것입니다.
public class AuthenticationProvider extends DaoAuthenticationProvider { // inject whatever tou want @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { return super.authenticate(authentication); // do what ever you want here } }
(DaoAuthenticationProvider를 사용한다고 가정)
그런 다음 콩 등록 만하면됩니다.
<bean class="x.y.z.AuthenticationProvider" id="myAuthProvider" scope="singleton" /> <authentication-manager> <authentication-provider ref="myAuthProvider"> <jdbc-user-service data-source-ref="dataSource" users-by-username-query="select email_id, password, enabled from user_table where lower(email_id)=lower(?)" authorities-by-username-query="select ut.email_id, ur.authority from user_table ut, user_roles ur where ut.user_id=ur.user_id and lower(ut.email_id)=lower(?)"/> </authentication-provider> </authentication-manager>
(코드의 정확성을 믿지 마라, 나는 그것을 즉시 작성했다. 그것은 단지 나의 생각을 보여주기위한 것이다.)
스테파노
from https://stackoverflow.com/questions/15493237/how-to-correctly-update-the-login-date-time-after-successful-login-with-spring-s by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring JPA 트랜잭션 진행 중 (0) | 2019.02.14 |
---|---|
[SPRING] Spring + Jersey 트랜잭션 주석 (0) | 2019.02.14 |
[SPRING] Spring - 처리 후 모든 요청에 대한 헤더 수정 (postHandle에서) (0) | 2019.02.14 |
[SPRING] Spring을 사용하여 JMS Listener 시작 및 중지 (0) | 2019.02.14 |
[SPRING] 컨텍스트 언로드시 연결 풀을 종료하는 방법? (0) | 2019.02.14 |