3

Spring Security を使用して登録およびログイン モジュールを既に開発しました。私の懸念は、自動保存されたログインを傍受してデータベースに情報を保存する方法についてです。つまり、ユーザーが「私を覚えている」とマークすると、アプリに入ると自動的にログに記録されたホームページに移動しますが、そのアクセスをデータベースに登録したいと思います。

ユーザーがログインページを明示的に通過する場合は簡単ですが、上記の場合はそうではありません。

よろしく、

更新:私はいくつかの追加情報を入れました:

  • security.xml

     <http auto-config="true">
         <form-login login-page="/login" login-processing-url="/j_spring_security_check" default-target-url="/private/dashboard" />
         <remember-me key="rememberMeKey" user-service-ref="userServiceImpl" />
     </http>
     <authentication-manager alias="authenticationManager" />
     <authentication-manager>
         <authentication-provider user-service-ref="userServiceImpl">
             <password-encoder hash="md5"/>
         </authentication-provider>
     </authentication-manager>
    
  • userServiceImpl

    @Service
    @Transactional
    public class UserServiceImpl implements UserDetailsService {
    
    @Resource
    private UserDao userDao;
    
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    
            List<GrantedAuthority> AUTHORITIES = new ArrayList<GrantedAuthority>();
            String password = userDao.getUserPassword(username);
    
            if (password!=null) {
                userDao.registerAccess(username);
                AUTHORITIES.add(new SimpleGrantedAuthority("ROLE_REGISTERED")); 
                return new User(username,password, AUTHORITIES);
        } else {
                throw new UsernameNotFoundException("User not found: " + username);
        }
    }
    

    }

4

2 に答える 2

1

このようなことができます

@Component
public class AppListener implements ApplicationListener {


    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof InteractiveAuthenticationSuccessEvent) {
            handleLoginEvent();
        } else if (event instanceof HttpSessionDestroyedEvent)
            handleLogoutEvent((HttpSessionDestroyedEvent) event);

    }

    private void handleLoginEvent() {
      // handle login event
    }

    private synchronized void handleLogoutEvent(HttpSessionDestroyedEvent event) {
        // handle logout event
    }

}

よろしく、

EDIT

これを web.xml に追加します

  <listener>
         <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
  </listener>
于 2013-01-16T09:03:02.963 に答える
1

ここには複数のオプションがあります。

  • org.springframework.security.web.authentication を設定します。AuthenticationSuccessHandler
  • org.springframework.security.authentication.event にサブスクライブします。InteractiveAuthenticationSuccessEvent (@Ionut の回答を参照)

AuthenticationSuccessHandlerは、両方のケースで同じように機能します(通常のログインと私を覚えています):

public class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
    Authentication authentication) throws ServletException, IOException {
        // log authentication success here for both cases
        super.onAuthenticationSuccess(request, response, authentication);
    }

}

あなたのsecurity.xmlで:

<bean id="customAuthenticationSuccessHandler" class="com.domain.security.CustomAuthenticationSuccessHandler"/>


<security:http ... >
    ...
    <security:form-login login-page='/login.html' authentication-success-handler-ref="customAuthenticationSuccessHandler" />
    <security:remember-me authentication-success-handler-ref="customAuthenticationSuccessHandler" />

</security:http>
于 2013-01-16T09:05:42.293 に答える