Spring 4 Ajax登录重定向到请求的URL

纳博尔

这是我配置的一部分

public class CustomWebSecurityConfigurer extends WebSecurityConfigurerAdapter {
    private static final String LOGIN_URL = "/#login";
    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        final String adminAccess = String.format("hasAnyRole('ROLE_%s', 'ROLE_%s')",
                Role.SYSTEM_ADMINISTRATOR, Role.USER_ADMINISTRATOR);
        http.authorizeRequests().antMatchers("/admin/**").access(adminAccess).and().formLogin()
                .loginPage(LOGIN_URL);
    }
}

可以看到,登录仅触发起始页面,而#login用于显示模式登录对话框,该对话框使用AJAX发送登录信息。

以下代码是登录名。

@RequestMapping(value = "/login", method = RequestMethod.POST)
ResponseEntity<Map<String, Object>> login(@RequestBody final JSONCredentials credentials) {
    log.debug("Test: {}", requestCache == null ? "null" : requestCache.getClass());
    final Authentication auth = new UsernamePasswordAuthenticationToken(credentials.getUsername(),
            credentials.getPassword());
    final Authentication authenticated = authenticationManager.authenticate(auth);
    if (authenticated.isAuthenticated()) {
        SecurityContextHolder.getContext().setAuthentication(authenticated);
        return get();
    }
    SecurityContextHolder.clearContext();
    throw new BadCredentialsException("");
}

它进行身份验证并调用get方法。

@RequestMapping(method = RequestMethod.GET)
ResponseEntity<Map<String, Object>> get() {
    final Map<String, Object> result = new HashMap<>();
    final Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    if (auth != null) {
        result.put("principal", auth.getPrincipal());
    }
    result.put("redirectTo", "URL where I come from");
    return ResponseEntity.ok(result);
}

因此,当我打开/ admin时,我将重定向到/#login。登录对话框打开,登录成功,但是我想重定向到最初请求的URL。
原始URL应该由Spring知道,作为AJAX登录的响应返回,而JavaScript只需更改位置。

纳博尔

同时,我实施了一个对我们非常有效的解决方案。

首先,我创建了一个AccessFilter,用于检查是否正在重定向到已配置的登录URL。

public class AccessFilter extends OncePerRequestFilter {
    private static final Logger log = LoggerFactory.getLogger(AccessFilter.class);

    @Inject private SessionContext ctx;
    @Inject private Environment env;

    @Override
    protected void doFilterInternal(final HttpServletRequest request,
            final HttpServletResponse response, final FilterChain filterChain)
            throws ServletException, IOException {
        filterChain.doFilter(request, response);
        if (response.getStatus() == 302 && response.getHeaderNames().contains("Location")
                && response.getHeader("Location").contains("#login")) {
            final String vrkroot = env.getProperty("VRK_HOST_NAME");
            final String myRoot = vrkroot.replaceAll("^https?://.+?/", "/");
            final String redirect = myRoot + request.getServletPath().replaceFirst("/", "")
                    + (request.getQueryString() != null ? "?" + request.getQueryString() : "");
            log.debug("URL: {}, Query: {}, Redirect: {}", request.getRequestURL().toString(),
                    request.getQueryString(), redirect);
            ctx.setAfterLoginRedirect(redirect);
        }
    }
}

环境变量VRK_HOST_NAME用于定义系统正在使用的真实URL。这是必需的,因为Tomcat 8服务器位于重定向到Tomcat上下文的Apache Web服务器的后面。

http://www.mydomain.de/ > localhost:8080/<ContextRoot>

我发现没有其他简单的方法来确定实际的URL。

从Apache的角度来看,myRoot包含我的应用程序的相对根,而不是从Tomcat的角度来看。仅当我的应用程序不在根目录中时,此选项才有意义。MyAppName可以不同于ContextRoot。

http://www.mydomain.de/MyAppName

最终,将计算重定向URL,并将其存储在上下文对象/变量中。

@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SessionContext implements Serializable {
    private static final long serialVersionUID = -8618385704526830047L;
    private String afterLoginRedirect;

    public String getAfterLoginRedirect() {
        return afterLoginRedirect;
    }

    public void setAfterLoginRedirect(final String afterLoginRedirect) {
        this.afterLoginRedirect = afterLoginRedirect;
    }
}

最后一块是Controller,它处理AJAX登录。

@RequestMapping(value = "/login", method = RequestMethod.POST)
ResponseEntity<Map<String, Object>> login(@RequestBody final JSONCredentials credentials) {
    final Authentication auth = new UsernamePasswordAuthenticationToken(credentials.getUsername(),
            credentials.getPassword());
    final Authentication authenticated = authenticationManager.authenticate(auth);
    if (authenticated.isAuthenticated()) {
        SecurityContextHolder.getContext().setAuthentication(authenticated);
        return get();
    }
    SecurityContextHolder.clearContext();
    throw new BadCredentialsException("");
}

@RequestMapping(method = RequestMethod.GET)
ResponseEntity<Map<String, Object>> get() {
    final Map<String, Object> result = new HashMap<>();
    final Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    final HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
            .getRequestAttributes()).getRequest();
    final CsrfToken csrfToken = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
    final HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder
            .getRequestAttributes()).getResponse();
    response.addHeader("X-CSRF-TOKEN", csrfToken.getToken());
    if (auth != null) {
        result.put("principal", auth.getPrincipal());
        if (!Strings.isNullOrEmpty(ctx.getAfterLoginRedirect())) {
            result.put("redirectTo", ctx.getAfterLoginRedirect());
            ctx.setAfterLoginRedirect(null);
        }
    }
    return ResponseEntity.ok(result);
}

控制器中的这两种方法都将进行登录并返回当前我是谁的信息。在该get方法中,重定向URL被发送到客户端,最后JavaScript进行了重定向。

希望这是有用的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用spring登录后重定向到请求的页面

来自分类Dev

Spring Security:登录后如何重定向到REST URL

来自分类Dev

Spring通过ajax成功登录后重定向到一个页面

来自分类Dev

登录后,Spring Security再次重定向到登录页面

来自分类Dev

Spring Security:登录后重定向到登录页面

来自分类Dev

Spring Security:登录后重定向到登录页面

来自分类Dev

登录后,Spring Security再次重定向到登录页面

来自分类Dev

Grails Spring Security OAuth2提供者对具有正确承载令牌的资源的请求重定向到登录

来自分类Dev

Spring Security总是重定向到登录页面

来自分类Dev

Spring Security和angular javascript重定向到登录页面

来自分类Dev

Spring Security *始终*重定向到登录表单

来自分类Dev

Spring Security和Angular javascript重定向到登录页面

来自分类Dev

Spring Security在登录后始终重定向到“ /”

来自分类Dev

Symfony 4 - 登录页面总是重定向到自身

来自分类Dev

配置Spring Security返回REST URL的403并重定向到其他URL的登录名

来自分类Dev

配置Spring Security返回REST URL的403并重定向到其他URL的登录名

来自分类Dev

Spring URL重定向

来自分类Dev

Spring Security将自定义登录页面重定向到其自身-重定向过多

来自分类Dev

使用重定向:uri登录后将Spring Security重定向到页面

来自分类Dev

IdentityServer4 如何在登录后重定向到以前的 url 页面而不在 IdP 注册所有路由

来自分类Dev

Spring MVC重定向到特定URL的jsp

来自分类Dev

Rails 4-提交后重定向到正确的URL

来自分类Dev

不重定向到特定的URL的笨4

来自分类Dev

Rails 4-提交后重定向到正确的URL

来自分类Dev

Spring 4 MVC登录拦截

来自分类Dev

即使我看到的页面未受保护,Spring登录也会将我重定向到登录页面

来自分类Dev

如果用户未登录Angular2 2.0.0-rc.4,则重定向到登录路由

来自分类Dev

Spring MVC URL重定向

来自分类Dev

Grails Spring Security-登录后总是重定向到特定页面吗?

Related 相关文章

  1. 1

    使用spring登录后重定向到请求的页面

  2. 2

    Spring Security:登录后如何重定向到REST URL

  3. 3

    Spring通过ajax成功登录后重定向到一个页面

  4. 4

    登录后,Spring Security再次重定向到登录页面

  5. 5

    Spring Security:登录后重定向到登录页面

  6. 6

    Spring Security:登录后重定向到登录页面

  7. 7

    登录后,Spring Security再次重定向到登录页面

  8. 8

    Grails Spring Security OAuth2提供者对具有正确承载令牌的资源的请求重定向到登录

  9. 9

    Spring Security总是重定向到登录页面

  10. 10

    Spring Security和angular javascript重定向到登录页面

  11. 11

    Spring Security *始终*重定向到登录表单

  12. 12

    Spring Security和Angular javascript重定向到登录页面

  13. 13

    Spring Security在登录后始终重定向到“ /”

  14. 14

    Symfony 4 - 登录页面总是重定向到自身

  15. 15

    配置Spring Security返回REST URL的403并重定向到其他URL的登录名

  16. 16

    配置Spring Security返回REST URL的403并重定向到其他URL的登录名

  17. 17

    Spring URL重定向

  18. 18

    Spring Security将自定义登录页面重定向到其自身-重定向过多

  19. 19

    使用重定向:uri登录后将Spring Security重定向到页面

  20. 20

    IdentityServer4 如何在登录后重定向到以前的 url 页面而不在 IdP 注册所有路由

  21. 21

    Spring MVC重定向到特定URL的jsp

  22. 22

    Rails 4-提交后重定向到正确的URL

  23. 23

    不重定向到特定的URL的笨4

  24. 24

    Rails 4-提交后重定向到正确的URL

  25. 25

    Spring 4 MVC登录拦截

  26. 26

    即使我看到的页面未受保护,Spring登录也会将我重定向到登录页面

  27. 27

    如果用户未登录Angular2 2.0.0-rc.4,则重定向到登录路由

  28. 28

    Spring MVC URL重定向

  29. 29

    Grails Spring Security-登录后总是重定向到特定页面吗?

热门标签

归档