spring-security 如何在Spring Security中启用会话和设置会话超时

ktecyv1j  于 2022-11-11  发布在  Spring
关注(0)|答案(8)|浏览(269)

我是Spring Security的新手,我正在开发登录、注销和会话超时特性。我已经参考本文档配置了我的代码。我的代码如下所示:

@Override
protected void configure(HttpSecurity http) throws Exception {

    http.authorizeRequests().antMatchers("/admin/**")
        .access("hasRole('ROLE_USER')").and().formLogin()
        .loginPage("/login").failureUrl("/login?error")
            .usernameParameter("username")
            .passwordParameter("password")
            .and().logout().logoutSuccessUrl("/login?logout").and().csrf();
    http.sessionManagement().maximumSessions(1).expiredUrl("/login?expired");
}

重写类抽象安全性Web应用程序初始化程序

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class SpringSecurityInitializer extends AbstractSecurityWebApplicationInitializer {

    @Override
    public boolean enableHttpSessionEventPublisher() {
        return true;
    }

}

我需要澄清我是否做得正确,如果它看起来不错,那么我需要在哪里设置会话超时。我做它完全基于注解。

qlzsbp2j

qlzsbp2j1#

如果您使用的是JavaConfig而不想使用XML,则可以创建一个HttpSessionListener并使用getSession().setMaxInactiveInterval(),然后在Initializer中添加onStartup()中的侦听器:

public class SessionListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        System.out.println("session created");
        event.getSession().setMaxInactiveInterval(15);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
       System.out.println("session destroyed");
    }
}

然后在初始化程序中:

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    super.onStartup(servletContext);
    servletContext.addListener(new SessionListener());
}
vu8f3i0k

vu8f3i0k2#

我可以通过在web.xml中添加以下配置来解决上述问题。任何更好的方法都将被接受。

<session-config>
    <session-timeout>20</session-timeout>
</session-config>
mbzjlibv

mbzjlibv3#

当使用application.properties设置属性server.session.timeout=时,值以秒为单位。

qzwqbdag

qzwqbdag4#

在Spring Security中配置会话超时时间(maxInactiveInterval)的不同方法。

1.通过在web.xml中添加会话配置(来自raju vaishnav的回答)
2.通过创建HttpSessionListener的实现并将其添加到servlet上下文中。(来自munilvc的答案)

3.通过在Spring安全配置中注册自定义AuthenticationSuccessHandler,并在onAuthenticationSuccess方法中设置会话最大非活动间隔。

这种实现具有以下优点,
1.登录成功后,您可以为不同的角色/用户设置不同的maxInactiveInterval值。
1.登录成功后,您可以在会话中设置用户对象,因此可以从会话中访问任何控制器中的用户对象。
缺点:您不能为ANONYMOUS用户(未验证的用户)设置会话超时
创建验证成功处理程序处理程序

public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler
{

    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
            throws IOException 
    {
        Set<String> roles = AuthorityUtils.authorityListToSet(authentication.getAuthorities());
        if (roles.contains("ROLE_ADMIN"))
        {
            request.getSession(false).setMaxInactiveInterval(60);
        }
        else
        {
            request.getSession(false).setMaxInactiveInterval(120);
        }
        //Your login success url goes here, currently login success url="/"
        response.sendRedirect(request.getContextPath());
    }
}

注册成功处理程序
以Java配置方式

@Override
protected void configure(final HttpSecurity http) throws Exception
{
    http
        .authorizeRequests()
            .antMatchers("/resources/**", "/login"").permitAll()
            .antMatchers("/app/admin/*").hasRole("ADMIN")
            .antMatchers("/app/user/*", "/").hasAnyRole("ADMIN", "USER")
        .and().exceptionHandling().accessDeniedPage("/403")
        .and().formLogin()
            .loginPage("/login").usernameParameter("userName")
            .passwordParameter("password")
            .successHandler(new MyAuthenticationSuccessHandler())
            .failureUrl("/login?error=true")
        .and().logout()
            .logoutSuccessHandler(new CustomLogoutSuccessHandler())
            .invalidateHttpSession(true)
        .and().csrf().disable();

    http.sessionManagement().maximumSessions(1).expiredUrl("/login?expired=true");
}

以xml配置方式

<http auto-config="true" use-expressions="true" create-session="ifRequired">
    <csrf disabled="true"/>

    <intercept-url pattern="/resources/**" access="permitAll" />
    <intercept-url pattern="/login" access="permitAll" />

    <intercept-url pattern="/app/admin/*" access="hasRole('ROLE_ADMIN')" />
    <intercept-url pattern="/" access="hasAnyRole('ROLE_USER', 'ROLE_ADMIN')" />
    <intercept-url pattern="/app/user/*" access="hasAnyRole('ROLE_USER', 'ROLE_ADMIN')" />

    <access-denied-handler error-page="/403" />

    <form-login 
        login-page="/login"
        authentication-success-handler-ref="authenticationSuccessHandler"
        authentication-failure-url="/login?error=true" 
        username-parameter="userName"
        password-parameter="password" />

    <logout invalidate-session="false" success-handler-ref="customLogoutSuccessHandler"/>

    <session-management invalid-session-url="/login?expired=true">
        <concurrency-control max-sessions="1" />
    </session-management>
 </http>

 <beans:bean id="authenticationSuccessHandler" class="com.pvn.mvctiles.configuration.MyAuthenticationSuccessHandler" />

工作代码以my github repository形式提供工作代码以两种形式提供
1. XML config way of implementation
2. JAVA config way of implementation
如果您想有自动注销功能和计时器,当会话即将到期时显示,如果用户正在填写表单但没有提交,那么用户可以通过单击'保持会话活动'按钮来延长会话如果您想实现自动注销,请参考stack overflow answer on auto logout on session timeout希望这会有所帮助

ifmq2ha2

ifmq2ha25#

在应用程序属性中,使用**server.servlet.session.timeout=1m**(如果未指定持续时间后缀,则将使用秒。)
默认情况下为30分钟。

vx6bjr1n

vx6bjr1n6#

我在UsernamePasswordAuthenticationFilter的子类中处理了它。您可以通过以下方式获得用户名-

obtainUsername(request);

应用用户检查并相应地设置超时,例如-

if(username.equalsIgnoreCase("komal-singh-sisodiya@xyz.com")) 
        {
        logger.debug("setting timeout 15 min");
        request.getSession(false).setMaxInactiveInterval(15*60);
        }
wwodge7n

wwodge7n7#

application.proprites中添加以下内容

server.servlet.session.timeout=
brqmpdu1

brqmpdu18#

这将起作用:

@EnableJdbcHttpSession(maxInactiveIntervalInSeconds = 84600)

相关问题