NanFeng778 2023-07-07 00:28 采纳率: 50%
浏览 26

Spring Security携带cookie访问受保护资源失败

登录成功后不响应成功的cookie

img

img


这导致我无法访问其它受限资源。
下面是securityConfig的配置

package com.loner.security.config;


import com.loner.security.SecurityComponents.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.web.util.matcher.OrRequestMatcher;

@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class securityConfig {


    private final UserDetailsServiceImpl userDetailsServiceImpl;

    @Autowired
    public securityConfig(UserDetailsServiceImpl userDetailsServiceImpl) {
        this.userDetailsServiceImpl = userDetailsServiceImpl;
    }

//    /**
//     * 密码明文加密方式配置
//     * @return
//     */
//    @Bean
//    public PasswordEncoder passwordEncoder() {
//        return new BCryptPasswordEncoder();
//    }

    /**
     * 自定义登录过滤器的配置
     */
    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration)
            throws Exception {
        return configuration.getAuthenticationManager();
    }


    //请求接收和校验并调用AuthenticationManager验证
    @Bean
    public LoginFilter loginFilter(AuthenticationManager authenticationManager) {
        LoginFilter loginFilter = new LoginFilter();
        loginFilter.setFilterProcessesUrl("/login");

        // 可以自定义用户名和密码的 key
        loginFilter.setUsernameParameter("username");
        loginFilter.setPasswordParameter("password");

        //调用AuthenticationManager处理用户名和密码的校验
        loginFilter.setAuthenticationManager(authenticationManager);
        //登录成功处理
        loginFilter.setAuthenticationSuccessHandler(new MyAuthenticationSuccessHandler());
        //登录失败处理
        loginFilter.setAuthenticationFailureHandler(new MyAuthenticationFailureHandler());
        return loginFilter;
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                // 关闭 csrf 防御
                .csrf(AbstractHttpConfigurer::disable)
//                // 基于 token,不需要 session
//                .sessionManagement((sessionManagement) ->
//                        sessionManagement
//                                .sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                //设置请求授权规则
                .authorizeHttpRequests(authorizeHttpRequests ->
                        authorizeHttpRequests
                                // 设置所有的请求都需要认证
                                .anyRequest().authenticated())
                //表单认证
                .formLogin(login ->login.loginProcessingUrl("/login"))
                // 指定我们的 loginFilter 添加到过滤器链的位置
                .addFilterAt(loginFilter(http.getSharedObject(AuthenticationManager.class)),
                        UsernamePasswordAuthenticationFilter.class)
                // 指定我们自定义的 Service 实现类
                .userDetailsService(userDetailsServiceImpl)
                .exceptionHandling(exceptionHandling ->
                        exceptionHandling
                                //未登录异常处理
                                .authenticationEntryPoint(new MyAuthenticationEnryPoint())
                                //权限不足异常处理
                                .accessDeniedHandler(new MyAccessDeniedHandler())
                )
                // 开启注销功能
                .logout((logout) ->
                        logout.deleteCookies()
                                .invalidateHttpSession(false)
                                //添加注销的多实现
                                .logoutRequestMatcher(new OrRequestMatcher(
                                        new AntPathRequestMatcher("/dologout",HttpMethod.DELETE.name()),
                                        new AntPathRequestMatcher("/dologout",HttpMethod.GET.name())
                                        ))
                 //注销成功处理
                .logoutSuccessHandler(new MyLogoutSuccessHandler()));

        return http.build();
    }

}

我是最近才学习springsecurity的,所有配置也不是很懂。而且我看的教程是老版的,配置的方法和我的也不一样,我人都学嘛了!

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-08 00:39
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 这篇博客: 权限系统设计模型以及SpringSecurity框架实现中的 游览器禁用了cookie的解决方法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

      如果浏览器端拒绝存储cookie信息,就会导致JSESSIONID的值不能正常到达客户端,
      那么客户端向服务器发送请求时,就无法将JSESSIONID的值带回到服务器中,从而导致找不到自己的会话Session
      我们可以使用URL地址重写的办法解决HttpServletResponse encodeURL()和 encodeRedirectURL() 。
      因为cookie在客户端只允许存储4k的数据,那么实际上cookie存储了3k数据就已经到达了一个极限了,cookie就会显得力不从心了,
      所以在B/S交互中就需要一个更大的存储数据对象,这就是session存在的重要起因。
      如果浏览器不支持Cookie,这些函数将重写您的网址以包含会话信息。根据您使用的Java Web框架,这些函数可能会自动调用(只要使用框架的方法编写URL)。
      请注意,在所有情况下都不是所希望的,因为使得会话ID在链接中可见的安全性和缓存影响。 此页面在这个短小的空间中比我可以更好地总结出问题,并提供了禁用此功能的方式。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 7月7日

悬赏问题

  • ¥15 dir815漏洞反弹shell失败
  • ¥15 支付宝小程序云函数登录获取user_id失败
  • ¥50 python for 循环速度慢
  • ¥15 CubeMX生成的代码用keil编译有报错
  • ¥15 Stata链式中介效应代码修改
  • ¥15 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 添加组件无法加载页面,某块加载卡住
  • ¥15 网络科学导论,网络控制