java - 使用 Spring-Security 登录并重定向到所需 URL 时出现问题

标签 java spring spring-mvc spring-security

我正在尝试使用 Spring-Security 登录。身份验证后,当我尝试重定向到用户仪表板页面时,它会返回到登录页面。我认为我们的安全上下文尚未创建或存在其他问题。以下是我的代码:

我的安全配置:

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .csrf().disable()
            .authorizeRequests()
            .antMatchers("/user/**").hasRole("USER")
            .antMatchers("/admin/**").hasAnyRole(new String[]{"ADMIN", "SUB_ADMIN"})
            .antMatchers(new String[]{"/*", "/public"}).permitAll()
            .anyRequest()
            .authenticated()
        .and()
        .formLogin()
            .loginPage("/check-url-pattern")
            .loginProcessingUrl("/authenticate")
            .usernameParameter("username")
            .passwordParameter("password")
            .successHandler(loginSuccessHandler)
            .failureHandler(loginFailureHandler)
            .permitAll()
        .and()
        .logout()
            .logoutUrl("/invalidate")
            .logoutSuccessHandler(logoutSuccesshandler)
            .invalidateHttpSession(true)

        .and()
        .headers().addHeaderWriter(new XFrameOptionsHeaderWriter(XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN));     

我的手动验证码:

@RequestMapping(value = "sign-in", method = RequestMethod.POST)
public String signIn(HttpServletRequest request) {
 logger.info(" signIn ");
 PasswordEncoder encoder=new BCryptPasswordEncoder();
 User userExisting1 = (User)userService.findUserByUserName(request.getParameter("emaillogin").trim());
 boolean matchPass =  encoder.matches(request.getParameter("secretlogin").trim(),  userExisting1.getSecret());
 if(userExisting1.getRole().equalsIgnoreCase("ROLE_USER") && userExisting1.getStatus().equalsIgnoreCase("active") && matchPass){
 UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userExisting1.getUserName(),userExisting1.getSecret());
 authentication.setDetails(userExisting1);
 SecurityContext securityContext = SecurityContextHolder.getContext();
 securityContext.setAuthentication(authentication);

 HttpSession session = request.getSession(true);
 session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext);
 return "redirect:/user/dashboard";
}

我的检查网址模式

@RequestMapping(value="/check-url-pattern", method=RequestMethod.GET)
public String checkUrlPattern(HttpServletRequest    request,HttpServletResponse response, RedirectAttributes attributes) {
 logger.info("in checkUrlPattern Controller");

 SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(request, response);
 if(savedRequest == null && getExistHttpSession() == null){
  return "redirect:/user-login";
 }else{ 
  String servletpath=savedRequest.getRedirectUrl();
  Pattern pattern = Pattern.compile("/admin");
  Matcher matcher = pattern.matcher(servletpath);
  Pattern pattern1 = Pattern.compile("/user");
  Matcher matcher1 = pattern1.matcher(servletpath);
  if (matcher.matches() && request.getSession(false) == null) {
    return "redirect:/admin-login-fin"; 
  }else if(matcher.matches() && request.getSession(false) != null){
   return "redirect:/admin/dashboard";
  }else if(matcher1.matches() && request.getSession(false) == null){
   return "redirect:/user-login";
  }else if(matcher1.matches() && request.getSession(false) != null){
   return "redirect:/user/dashboard";
  }else{
 return "redirect:/";
}

}

当我提交登录表单时,我的 sign-in Controller 将被调用并执行我的登录代码。之后,当我尝试重定向到 /user/dashboard url 时,Spring-Security 会将我重定向回 /check-url-pattern 。还可以使用 Spring-Security 自定义表单提交来处理登录。但将来我希望通过 Ajax 请求来实现这一点。

最佳答案

您在安全配置的 .formLogin() 中错过了 .default-target-url="/user/dashboard"

关于java - 使用 Spring-Security 登录并重定向到所需 URL 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29210374/

相关文章:

java - Spring从Controller中的URL获取所有参数

java - 如何从 Maven 解析器中排除 persistence.xml

Java 关闭钩子(Hook)与 ExecutorService

java - 使用 @Parameter 的 Hibernate 注释不起作用

java - 如何使在全局 applicationContext 的 Spring-MVC 应用程序中创建的 2 个 applicationContexts

java - 如何在 Junit PowerMockito 中使用 System.getenv

java - Spring自定义请求上下文

spring - JdbcDaoSupport 是做什么用的?

java - Spring GET相同的URL但不同的参数类型

spring - 为什么 Spring 允许私有(private)方法上的 Controller 注释请求映射?