spring-security退出登陆


项目源码地址 https://github.com/nieandsun/security

1 spring-security默认退出处理逻辑

Spring Security的退出登陆功能由LogoutFilter过滤器拦截处理,默认的退出登陆url为 /logout。

在退出登陆时会做如下几件事:

  • 使当前session失效
  • 清除当前用户的remember-me记录
  • 清空当前的SecurityContext
  • 重定向到登录界面

2 自定义退出登陆的一些处理逻辑

在配置文件里自定义退出登陆的一些处理逻辑

.and()
   //退出登陆相关的逻辑
   .logout()
   //自定义退出的url---默认的为/logout
   .logoutUrl("/signOut")
   //自定义退出成功处理器
   .logoutSuccessHandler(logoutSuccessHandler)
   //自定义退出成功后跳转的url与logoutSuccessHandler互斥
   //.logoutSuccessUrl("/index")
   //指定退出成功后删除的cookie
   .deleteCookies("JSESSIONID")

不要忘记对涉及到的URL进行授权

//配置不用进行认证校验的url
.antMatchers(
   SecurityConstants.DEFAULT_UNAUTHENTICATION_URL,
   SecurityConstants.DEFAULT_LOGIN_PROCESSING_URL_MOBILE,
   nrscSecurityProperties.getBrowser().getLoginPage(),
   SecurityConstants.DEFAULT_VALIDATE_CODE_URL_PREFIX + "/*",
   nrscSecurityProperties.getBrowser().getSignUpUrl(),
   //session失效默认的跳转地址
   nrscSecurityProperties.getBrowser().getSession().getSessionInvalidUrl(),
   //获取第三方账号的用户信息的默认url
   SecurityConstants.DEFAULT_GET_SOCIAL_USERINFO_URL,
   //退出登陆默认跳转的url
   nrscSecurityProperties.getBrowser().getSignOutUrl(),
   "/user/register",
   "/js/**"
)
.permitAll()

自定义的退出成功处理器

package com.nrsc.security.browser.logout;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.nrsc.security.utils.ResultVOUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.Result;
import java.io.IOException;

/**
 * @author : Sun Chuan
 * @date : 2019/9/22 12:00
 * Description:退出成功处理器
 */
@Slf4j
public class NRSCLogoutSuccessHandler implements LogoutSuccessHandler {
    /**
     * 退出登陆url
     *      可以在yml或properties文件里通过nrsc.security.browser.signOutUrl 进行指定
     *      我指定的默认值为"/" --- 因为如果不指定一个默认的url时,配置授权那一块会报错
     */
    private String signOutSuccessUrl;
    private ObjectMapper objectMapper = new ObjectMapper();
    public NRSCLogoutSuccessHandler(String signOutSuccessUrl) {
        this.signOutSuccessUrl = signOutSuccessUrl;
    }

    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
            throws IOException, ServletException {

        log.info("退出成功");
        //如果没有指定退出成功的页面则返回前端一个json字符串
        if (StringUtils.equalsIgnoreCase("/",signOutSuccessUrl)) {
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().write(objectMapper.writeValueAsString(ResultVOUtil.success("退出成功")));
        } else {
            //重定向到退出成功登陆页面
            response.sendRedirect(signOutSuccessUrl);
        }
    }
}

3 测试

3.1 yml未指定signOutUrl

则登陆后点击退出会进入到如下页面
在这里插入图片描述

3.2 yml里指定了signOutUrl为/nrsc-logout.html

则登陆后点击退出会进入到如下页面
在这里插入图片描述

3.3 清除当前用户的remember-me记录相关功能测试

  • 登陆前persistent_logins表里没有任何信息

在这里插入图片描述

  • 登陆时勾选上记住我

在这里插入图片描述

  • persistent_logins表里多了一条用户数据

在这里插入图片描述

  • 点击退出

在这里插入图片描述

  • 页面显示退出成功,数据库persistent_logins表里的用户数据被删除

在这里插入图片描述

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Spring Boot 项目中使用 Spring Security,需要添加 spring-boot-starter-security 依赖。以下是一个简单的配置示例: 1. 添加依赖 在 pom.xml 文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> ``` 2. 配置权限 在 Spring Security 中,权限(Authority)是指用户可以执行的操作。可以通过配置权限来限制用户的访问。 ``` @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasAnyRole("ADMIN", "USER") .antMatchers("/**").permitAll() .and().formLogin() .and().logout().logoutSuccessUrl("/login?logout"); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("admin").password("{noop}admin123").roles("ADMIN") .and() .withUser("user").password("{noop}user123").roles("USER"); } } ``` 在上面的配置中,我们定义了三个权限: - /admin/**:只有 ADMIN 角色的用户可以访问 - /user/**:只有 ADMIN 或 USER 角色的用户可以访问 - /**:所有用户都可以访问 最后,我们使用 inMemoryAuthentication() 方法来定义两个用户和它们的角色。 3. 配置登录和退出 在上面的配置中,我们使用 formLogin() 方法来配置登录页面和处理登录请求的 URL。同时,我们也使用 logout() 方法来配置退出登录的 URL 和成功退出后的跳转页面。 ``` .and().formLogin() .and().logout().logoutSuccessUrl("/login?logout"); ``` 这里我们配置了退出登录后跳转到登录页面,并添加了一个参数表示已经退出登录。 4. 配置 CSRF 在 Spring Security 中,默认开启了 CSRF(Cross-site Request Forgery)保护,可以有效防止跨站点攻击。如果你的应用程序不需要 CSRF 保护,可以通过以下配置关闭: ``` @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); } } ``` 5. 配置 HTTPS 在 Spring Security 中,可以通过以下配置开启 HTTPS 支持: ``` @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.requiresChannel() .anyRequest().requiresSecure(); } } ``` 以上就是使用 spring-boot-starter-security 进行 Spring Security 配置的示例。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值