在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的行为不一致,有时起作用,有时不起作用。会有什么问题?
问题是,当它重定向到过期的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)