Spring Security - 需要添加自定义cookies

Posted

技术标签:

【中文标题】Spring Security - 需要添加自定义cookies【英文标题】:Spring Security - Need to add custom cookies 【发布时间】:2018-10-28 19:28:38 【问题描述】:

我是 Servlet 的新手。我需要生成自定义值 cookie。在下面提到的代码中,会生成会话 cookie,但我还需要一个自定义值。

public ServletContextInitializer servletContextInitializer() 
    servletContext -> servletContext.getSessionCookieConfig().setName("sessiondemo");

我的 Servlet 代码如下。在注释行中,我需要添加 cookie。基本上,我将重定向到这里的请求来初始化 servlet 会话,同时我还需要在 servletcontext 中生成一个名为 hello 和 value world 的 cookie。

public class WebSecurityConfigurer extends WebMvcConfigurerAdapter 

    @Autowired
    private Environment environment;
    UserDetails user;

    @Override
    public void addViewControllers(ViewControllerRegistry registry) 
        registry.addViewController("/login").setViewName("login");
    

    @Bean
    public ServletContextInitializer servletContextInitializer() 
        /* This code doesn't work here. I need to use here to set up the cookie
        Cookie cookie = new Cookie("YourCookieName", "CookieStringValue");
        cookie.setMaxAge(10 * 365 * 24 * 60 * 60); // set cookie for 10 years
        response.addCookie(cookie); */
        return servletContext -> servletContext.getSessionCookieConfig()
                .setName("oneKosmosIdpSessionId");
    

    @Configuration
    @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
    protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter 

        @Autowired
        private IdpConfiguration idpConfiguration;

        @Override
        protected void configure(HttpSecurity http) throws Exception 
            http
                    .csrf().disable()
                    .authorizeRequests()
                    .antMatchers("/", "/metadata", "/favicon.ico", "/api/**", "/*.css",
                            "/css/**", "/js/**", "/img/**", "/fonts/**").permitAll()
                    .antMatchers("/admin/**").hasRole("ADMIN")
                    .anyRequest().hasRole("USER")
                    .and()
                    .formLogin()
                    .loginPage("/login")
                    .permitAll()
                    .defaultSuccessUrl("/user.html", true)
                    .failureUrl("/login?error=true")
                    .permitAll()
                    .and()
                    .logout()
                    .logoutSuccessUrl("/");
        

        @Override
        public void configure(AuthenticationManagerBuilder auth) throws Exception 
            auth.authenticationProvider(new AuthenticationProvider(idpConfiguration));
        
    

【问题讨论】:

您已将会话跟踪 cookie(通常为 JSESSIONID)重命名为 sessiondemo。自定义值对您来说是什么意思? 意味着我必须再创建一个 cookie,比如 flag="true"。我不想删除这个 sessiondemo cookie 需要再添加一个。 【参考方案1】:

sessionCookieConfig 类用于更改 Servlet 引擎的常规 cookie 设置。

由于您使用的是 Spring Security,因此会话管理由 Spring 处理。所以,你真的不需要cookies。如果您需要存储任何用户级别的参数,请将其存储在您自己的 Spring 的 UserDetails 对象实现中并在视图中检索它。

此标签允许访问存储在 安全上下文。它直接在 JSP。因此,例如,如果 Authentication 是 Spring Security 的 UserDetails 对象的一个​​实例, 然后使用 will 呈现当前用户的名字。

当然,这种事情不需要使用JSP标签 有些人喜欢在 看法。您可以在 MVC 控制器中访问 Authentication 对象 (通过调用 SecurityContextHolder.getContext().getAuthentication()) 并将数据直接添加到模型中以供视图渲染。

来源:https://docs.spring.io/spring-security/site/docs/3.0.x/reference/taglibs.html

【讨论】:

@Priyanka Kanse 你检查了authentication 标签吗?【参考方案2】:

我需要生成自定义值 cookie。

您可以通过将此代码添加到您的 servlet 来创建具有自定义值的 cookie,如下所示:

Cookie cookie = new Cookie("YourCookieName","CookieStringValue");
cookie.setMaxAge(10 * 365 * 24 * 60 * 60); //set cookie for 10 years
response.addCookie(cookie); //add cookie to response

【讨论】:

你在哪里试过的?它怎么不工作?您是否检查过您的浏览器 cookie 是否存在? 我已经发布了代码请查看@Jonathan 是的,我明白为什么它在那里不起作用@PriyankaKanse。您不在 servlet 中,因此没有响应。您需要在 servlet(类扩展 HttpServlet)中使用该代码,并且您有 doPost/doGet 方法。 如何根据需要在这里使用它。我正在使用 springbok 和 theamleaf。 这个类是怎么调用的?从哪里来?

以上是关于Spring Security - 需要添加自定义cookies的主要内容,如果未能解决你的问题,请参考以下文章

JSF / Spring Security - 添加其他登录字段不会调用自定义过滤器

认证与授权Spring Security自定义页面

认证与授权Spring Security自定义页面

Spring Security 自定义 AuthenticationException 消息

spring security 无法添加自定义身份验证提供程序

如何将自定义密码编码器添加到 Spring Security?