从零学习spring security(五)单机session管理

一、session过期处理
我们知道session默认的过期时间是30分钟,为了快速实现session过期后如何处理,我们将session设置成1分钟,当然security里面要求session最少过期时间是1分钟,如果设置的少于1分钟会当成1分钟处理
1) application.properties中设置session过期时间

server.servlet.session.timeout=60s
  1. 在WebSecurityConfigurerAdapter实现类中配置session过期后的跳转路径及设置不拦截该路径
 protected void configure(HttpSecurity http) throws Exception {

        ValidateCodeFilter validateCodeFilter = new ValidateCodeFilter();
        validateCodeFilter.setAuthenticationFailureHandler(failHandler); // 使用我们自定义的失败处理器

        http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class) // 在UsernamePasswordAuthenticationFilter过滤器前面增加验证码过滤器
                .formLogin()
                    .loginPage("/authentication/require")
                    .loginProcessingUrl("/authentication/form")
                    .successHandler(authentication)
                    .failureHandler(failHandler)
                    .and()
                .rememberMe()
                    .tokenRepository(persistentTokenRepository())
                    .tokenValiditySeconds(securityProperties.getProperties().getRememberMeSeconds())
                    .userDetailsService(userDetailsService)
                .and()
                    .sessionManagement()
                    .invalidSessionUrl("/session/invalid") //session过期跳转路径
                .and()
                .authorizeRequests()
                .antMatchers("/authentication/require",
                        securityProperties.getProperties().getLoginPage(),
                        "/code/image",
                        "/code/sms",
                        "/session/invalid").permitAll() // 不拦截/code/image
                .anyRequest()
                .authenticated()
                .and()
                .csrf().disable();
    }

3)处理session过期跳转路径,当session过期后给前端返回session失效信息

    @GetMapping("/session/invalid")
    @ResponseStatus(code = HttpStatus.UNAUTHORIZED)
    public String sessionInvalid(){

        String message = "session失效";
        return message;
    }

在页面中我们可以提示后重定向到登录页面进行登录,这样简单的session过期处理就完成了。
二、session并发控制
有时侯我们会有这样的需求,一个账号只允许一个地方登录。不能同时在两个地方登录一个账号。
1)实现SessionInformationExpiredStrategy,处理同时登录。

public class ExpireSessionStrategy implements SessionInformationExpiredStrategy {
    @Override
    public void onExpiredSessionDetected(SessionInformationExpiredEvent event) throws IOException, ServletException {

        event.getResponse().setContentType("application/json;charset=utf-8");
        event.getResponse().getWriter().write("并发登录");
    }
}

2)后登陆的账号挤掉前面登录的账号,继续配置我们实现的WebSecurityConfigurerAdapter类

   .and()
	   .sessionManagement()
	   .invalidSessionUrl("/session/invalid")
	   .maximumSessions(1) // 一个账号同时在线一个用户
	   .expiredSessionStrategy(new ExpireSessionStrategy())

3)如果一个账号已登录,不允许在进行登录

   .and()
	   .sessionManagement()
	  	.invalidSessionUrl("/session/invalid")
	   .maximumSessions(1) // 一个账号同时在线一个用户
	   .maxSessionsPreventsLogin(true) // 如果一个账号已经登录了一个用户,则后面的不让登录
	   .expiredSessionStrategy(new ExpireSessionStrategy())

ok,这样就实现了一个账号仅能一处登录了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Security是一个强大的Java框架,用于实现应用程序的身份验证、授权和安全性管理。要从开始学习Spring Security管理,你可以按照以下步骤进行: 1. 添加Spring Security依赖:在你的项目中添加Spring Security依赖,可以通过Maven或者Gradle进行配置。 2. 配置Spring Security:创建一个配置类,并继承`WebSecurityConfigurerAdapter`,重写`configure`方法。在该方法中,配置权限验证和授权规则。 3. 用户认证:配置用户认证,你可以使用内存存储、数据库存储或者自定义认证逻辑。对于简单的示例,你可以使用内存存储。在配置类中,通过重写`configure(AuthenticationManagerBuilder auth)`方法来配置用户认证。 4. 授权管理:定义你的应用程序的授权规则。通过重写`configure(HttpSecurity http)`方法来配置授权规则。你可以设置URL的访问权限,启用或禁用CSRF保护,配置登录页面等。 5. 注解权限控制:使用注解对方法或URL进行细粒度的权限控制。通过使用`@PreAuthorize`和`@PostAuthorize`注解,你可以在方法级别或返回值级别进行权限控制。 6. 自定义访问决策器:如果你需要更高级的权限控制逻辑,可以实现`AccessDecisionVoter`接口来自定义访问决策器。 7. 登录和注销:配置登录页面和注销功能,使用户可以登录和退出应用程序。 8. 异常处理:处理Spring Security抛出的各种异常,例如未授权访问、登录失败等。可以通过实现`AuthenticationEntryPoint`和`AccessDeniedHandler`接口来自定义异常处理。 这些步骤将帮助你从开始学习Spring Security的权限管理。你可以根据你的具体需求进行配置和扩展。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java旅途

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值