【问题标题】:Spring Security 3 Get Initially Requested URLSpring Security 3 获取初始请求的 URL
【发布时间】:2016-05-02 17:34:56
【问题描述】:

我需要根据用户的来源修改我的 Spring Security 登录页面。我的客户希望两者之间的风格不同。如果您来自appcontextroot/testappcontextroot/choose。我尝试执行以下操作,但 String url=savedRequest.getRedirectUrl(); 已经等于 spring 登录页面,而不是用户请求的初始页面。有什么想法吗?

ExternalContext externalContext = FacesUtils.getExternalContext();
    HttpServletRequest request = (HttpServletRequest)externalContext.getRequest();
    HttpSession session = request.getSession(false);
    if(session != null) {
        SavedRequest savedRequest = new DefaultSavedRequest(request, new PortResolverImpl());
        String url=savedRequest.getRedirectUrl();
    } 

【问题讨论】:

  • 我认为您必须创建两个不同的登录页面,并带有相应的过滤器。
  • Alois,感谢您的回复,您知道这样做的示例吗?我是 Spring Security 的新手...谢谢!

标签: spring spring-security


【解决方案1】:

您需要从会话中提取SavedRequest,而不是创建一个新的:

SavedRequest savedRequest = 
    new HttpSessionRequestCache().getRequest(request, response);

【讨论】:

  • 感谢您的回复...我找不到合适的钥匙。我试过 request.getSession().getAttribute(WebAttributes.SAVED_REQUEST);我正在使用 spring security 3.1.0.M1
  • @c12:不要手动,使用HttpSessionRequestCache,如上图。
  • 在 HttpSessionRequestCache 中还有很多其他的东西 - 它看起来应该是一个可注入的 bean,而不是你必须新的帮助!
【解决方案2】:
SavedRequest savedRequest =
    (SavedRequest)session.getAttribute("SPRING_SECURITY_SAVED_REQUEST");
// ...check for null...
String targetUrl = savedRequest.getRedirectUrl();

如果您没有可用的 HttpServletResponse(例如,如果您使用 org.springframework.social.connect.web.SignInAdapter),那么丑陋但有效。

使用 Spring Security 3.1.0.RC2 测试。

【讨论】:

    【解决方案3】:

    我没有使它与提出的解决方案一起工作,这是我发现的: (使用弹簧 3.1)。

    在您的装配工课程中:

    CharsetFilter implements Filter {
        @OVerride public void doFilter(ServletRequest request, ServletResponse response, FilterChain next) throws IOException, ServletException {
            HttpServletRequest hsr = (HttpServletRequest) request;
            if (hsr.getUserPrincipal() == null) {
                HttpSession session = hsr.getSession();
                if (!(hsr == null)) {
                    logger.info("path : " + hsr.getPathInfo());
                    session.setAttribute("beforeLoginUrl", hsr.getPathInfo());
        }
      }
    }
    

    然后我你的 web.xml 声明你的过滤器:

    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter>
        <filter-name>charsetFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>charsetFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>CharsetFilter</filter-name>
        <filter-class>com.ent.foo.CharsetFilter</filter-class>
        <init-param>
            <param-name>requestEncoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    

    然后在成功登录后的重定向 url 中返回 HttpSession :

    @RequestMapping(value = "successful")
    public void showSuccessfulogin (HttpSession session) {
        String redirectUrl = (String) session.getAttribute("beforeLoginUrl");
        if (redirectUrl != null) {
            session.removeAttribute("beforeLoginUrl");
            return "redirect:" + redirectUrl;
        }
        return "redirect:/";
    }
    

    这里你得到了让它工作的东西,但是你必须检查

    hsr.getPathInfo()
    

    看看是否以.css或.js等结尾...

    此外,如果登录失败,您应该查看会话属性是否已设置并查看其他特殊情况!

    顺便说一句,我的过滤器以前用于格式化 utf-8 中的所有输入/输出。

    希望对大家有所帮助。

    【讨论】:

    • 你不应该对静态资源使用过滤器,这会严重影响性能。
    • 你能说得更准确点吗?
    • 一般来说,您将静态文件放在具有匿名访问权限的目录中,或者放在没有安全措施的完全不同的服务器上。只有真正存在安全问题的静态资源(即不是 css 或 js)才应该受到安全保护。否则,您将在不需要时为每个静态资源请求执行所有这些处理(以及您看不到的更多处理)。
    【解决方案4】:

    对我来说,我使用 Spring Security 3.0.0 并且以下工作:

    DefaultSavedRequest savedRequest=(DefaultSavedRequest) request.getSession().getAttribute("SPRING_SECURITY_SAVED_REQUEST_KEY"); targetUrl=savedRequest.getRedirectUrl();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 2017-02-01
      • 2011-08-15
      • 2013-05-07
      • 2021-02-23
      • 2020-11-29
      • 1970-01-01
      相关资源
      最近更新 更多