我的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);
}
谢谢。
答案 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);
}