当前位置: 首页 > 知识库问答 >
问题:

在spring security 4中,不重定向到过期url的并发会话

高泳
2023-03-14

在spring security 4中,并发会话不重定向到过期的url,而是重定向到失败的身份验证url。下面是java配置代码片段。

/*start of code*/
public class SecurityContextConfig extends WebSecurityConfigurerAdapter {

private static final Logger logger = LoggerFactory.getLogger(SecurityContextConfig.class);

/**
 * @param auth
 * @throws Exception
 */
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    logger.debug("configureGlobal() : Start : auth={}", auth);
    auth.authenticationProvider(userDetailsAuthenticationProvider());
}

@Override
public void configure(WebSecurity web) throws Exception {
    logger.debug("configure() : Start : web={}", web);
    // This is here to ensure that the static content (JavaScript, CSS, etc)
    // is accessible from the login page without authentication
    web.ignoring().antMatchers("/resources/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    logger.debug("configure() : Start : http={}", http);

    http
        .authorizeRequests()
            .antMatchers("/resources/**")
                .permitAll()
            .antMatchers("/login/**")
                .permitAll()
            .antMatchers("/authenticate/**")
                .permitAll()
            .antMatchers("/ssoLogout")
                .permitAll()
            .antMatchers("/forgotpassword/json")
                .permitAll()
            .antMatchers("/favicon.ico")
                .permitAll()
            .antMatchers("/secure/**")
                .authenticated()
            .and()

            // This is where we configure our login form.
            // login-page: the page that contains the login screen
            // login-processing-url: this is the URL to which the login form
            // should be submitted
            // default-target-url: the URL to which the user will be
            // redirected if they login successfully
            // authentication-failure-url: the URL to which the user will be
            // redirected if they fail login
            // username-parameter: the name of the request parameter which
            // contains the username
            // password-parameter: the name of the request parameter which
            // contains the password
            .formLogin()
                .loginPage("/")
                .loginProcessingUrl("/authenticate")
                .failureUrl("/")
                .successHandler(loginSuccessHandler())
            .and()

            // This is where the logout page and process is configured. The
            // logout-url is the URL to send
            // the user to in order to logout, the logout-success-url is
            // where they are taken if the logout
            // is successful, and the delete-cookies and invalidate-session
            // make sure that we clean up after logout
            .logout()
                .logoutUrl("/logout")
                .logoutSuccessHandler(logoutHandler())
                .deleteCookies("JSESSIONID")
                .invalidateHttpSession(true)
            .and()

            .csrf()
            .and()

            // The session management is used to ensure the user only has
            // one session. This isn't
            // compulsory but can add some extra security to your
            // application.
            .sessionManagement()
                //.invalidSessionUrl("/login")
                .sessionFixation()
                .changeSessionId()
            .maximumSessions(1)
                .expiredUrl("/login?reason=CONCURRENT_SESSION");
            http.exceptionHandling().accessDeniedHandler(accessDeniedHandler());
    logger.debug("configure() : End : http={}", http);

}

/**
 * @return
 */
@Bean(name = "loginSuccessHandler")
public LoginSuccessHandler loginSuccessHandler() {
    logger.debug("loginSuccessHandler() : Start.");
    LoginSuccessHandler loginSuccessHandler = new LoginSuccessHandler();

    logger.debug("loginSuccessHandler() : End : loginSuccessHandler={}", loginSuccessHandler);
    return loginSuccessHandler;}

/**
 * @return
 */
@Bean(name = "logoutHandler")
public LogoutHandler logoutHandler() {
    logger.debug("logoutHandler() : Start.");

    LogoutHandler logoutHandler = new LogoutHandler();

    logger.debug("logoutHandler() : End : logoutHandler={}", logoutHandler);

    return logoutHandler;
}

/**
 * @return
 */
@Bean(name = "authenticationProvider")
public UserDetailsAuthenticationProvider userDetailsAuthenticationProvider() {
    logger.debug("userDetailsAuthenticationProvider() : Start.");

    UserDetailsAuthenticationProvider authenticationProvider = new UserDetailsAuthenticationProvider();

    logger.debug("userDetailsAuthenticationProvider() : End : authenticationProvider={}", authenticationProvider);

    return authenticationProvider;
}

@Bean(name="accessDeniedHandler")
public AccessDeniedHandlerImpl accessDeniedHandler(){

AccessDeniedHandlerImpl accessDeniedHandler=new AccessDeniedHandlerImpl();
accessDeniedHandler.setErrorPage("/login?reason=Access Denied");
    return accessDeniedHandler;

}}

过期url的行为不一致,有时起作用,有时不起作用。会有什么问题?

共有1个答案

杜霍英
2023-03-14

问题是,当它重定向到过期的URL时,您的用户没有访问该URL的权限,因此它将用户发送到登录页面(与登录失败的URL相同)。

您需要确保授予每个用户访问过期URL的权限。例如:

java prettyprint-override">http
    .authorizeRequests()
        .antMatchers("/login")
            .permitAll()
        ...
 类似资料:
  • 问题内容: 我是Python和Flask的新手,我正在尝试做与中相同的操作-即:重定向到特定的URL-我该如何处理? 这是我的代码: 问题答案: 你必须返回重定向: 请参阅flask文档上的文档。代码的默认值为302,因此可以省略或用其他重定向代码(301、302、303、305和307中的一个)替换。

  • 我正在使用Spring MVC和Spring Security ver4。0.1.释放我试图将并发用户登录控制为1,如果用户已经登录,则显示一条错误消息。并发会话管理按预期工作,但expireUrl(“”)不工作。这个formLogin()。登录页面(“”)。始终调用failureUrl(“”)而不是expireUrl(“”)。请帮忙。 下面是我的SpringSecurityConfigurati

  • 我是Python和Flask的新手,我正在尝试做与如C#-ie:重定向到一个特定的URL-我该怎么做? 这是我的密码:

  • 我将spring-session与hazelcast和spring-security一起使用。我正面临spring security无法从HttpSession加载安全上下文的问题。在身份验证期间,我可以看到以下代码将安全上下文设置为会话: 但在spring重定向到目标url时进行身份验证后,它无法从会话中获取安全上下文,代码如下: 知道这里有什么问题吗?安全调试日志-

  • 我正在尝试创建无状态安全性,从而将JWT令牌存储在Cookie而不是SESSION中。 问题是,如果没有会话,就不知道原始请求(在身份验证页面弹出之前)。所以在第77行这里savedRequest是空的。 这看起来很奇怪,我想我做错了什么。如何允许页面重定向到登录无状态会话后请求的原始URL? > 我禁用会话 然后,我创建了一个自定义的AuthenticationSuccessHandler,它扩

  • 重定向到一个 URL 。 使用 window.location.href 或 window.location.replace() 重定向到 url 。 传递第二个参数来模拟链接点击(true - 默认值)或HTTP重定向(false)。 const redirect = (url, asLink = true) => asLink ? (window.location.href = url)