Spring Security 4中的方法determineTargetUrl未被调用

时间:2016-01-05 19:47:07

标签: java spring login spring-security

我的Spring MVC 4项目中有一个CustomLoginSucessHandler来管理用户登录时的操作。

这是正常的。在同一个班级中,我使用方法determineTargetUrl根据他的ROLE重定向用户。

以下是代码:

@Override
    protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response){
        final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        final String userName = authentication.getName();       
        log.debug("TARGET URL METHOD!");
         List<Authority> authorityList = authorityService.getAllAuthoritiesByUserName(userName);

         for(Authority authority: authorityList){
             switch (authority.getAuthority()){

             case "ROLE_ADMIN": 
                 return "processFile";

             case "ROLE_USER":
                 return "userPortal";

             case "ROLE_DEMO1":
                 return "processFile";

             case "ROLE_DEMO2":
                 return "processFile";                      
            }            

         }
        return "403";   



    }

看到我有log.debug("TARGET URL METHOD")

永远不会调用此日志,当然页面未被重定向,它将转到processFile.html的默认登录页面。

我很疑惑为什么在我的onAuthenticationSuccess完美运作时没有调用第二种方法。他们属于同一类。

以下是我创建CustomLoginSucessHandler实例的代码:

public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Autowired
    private DataSource dataSource;

    @Autowired
    private CustomLoginSucessHandler customLoginSucessHandler;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage("/login.html")
                .loginProcessingUrl("/login").permitAll().and().logout().logoutSuccessUrl("/")
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout")).permitAll().and().exceptionHandling()
                .accessDeniedPage("/403.html");

        http.csrf().requireCsrfProtectionMatcher(new CsrfRequestMatcher());
        http.formLogin().successHandler(customLoginSucessHandler);  

    }

谢谢。

1 个答案:

答案 0 :(得分:3)

您正在试图解决错误的功能,这是您问题的根本原因。在您提供的摘录中,您有一个似乎重写另一个的功能:

@Override
protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response){

但实际上它并没有覆盖任何内容。如果您检查AuthenticationSuccessHandler的javadoc,您会看到它只提供了一个函数:onAuthenticationSuccess您报告为&#34;工作&#34 ;.它可以工作,但它是一个覆盖函数,它会作为标准登录过程的一部分被调用。如果你密切关注这个例子:

CustomLoginSuccessHandler example (可能你已经跟着这个了)

您将看到determineTargetUrl函数未被覆盖,但由实现明确调用:

protected void handle(HttpServletRequest request, 
  HttpServletResponse response, Authentication authentication) throws IOException {
    String targetUrl = determineTargetUrl(authentication);

依次从<:p>调用哪个句柄方法

@Override
public void onAuthenticationSuccess(HttpServletRequest request, 
  HttpServletResponse response, Authentication authentication) throws IOException {
    handle(request, response, authentication);
    clearAuthenticationAttributes(request);
}