我们正在尝试从RC1升级到RELEASE,但现在出现以下异常:
Caused by: redis.clients.jedis.exceptions.JedisDataException: ERR unknown command 'CONFIG'
at redis.clients.jedis.Protocol.processError(Protocol.java:100) ~[Protocol.class:na]
at redis.clients.jedis.Protocol.process(Protocol.java:118) ~[Protocol.class:na]
at redis.clients.jedis.Protocol.read(Protocol.java:187) ~[Protocol.class:na]
at redis.clients.jedis.Connection.getBinaryMultiBulkReply(Connection.java:212) ~[Connection.class:na]
at redis.clients.jedis.Connection.getMultiBulkReply(Connection.java:205) ~[Connection.class:na]
at redis.clients.jedis.Jedis.configGet(Jedis.java:2701) ~[Jedis.class:na]
at org.springframework.data.redis.connection.jedis.JedisConnection.getConfig(JedisConnection.java:531) ~[JedisConnection.class:1.3.0.RELEASE]
... 29 common frames omitted
Run Code Online (Sandbox Code Playgroud)
这是我的SessionConfig:
@EnableRedisHttpSession
public class SessionConfig {
private static final int SESSION_EXPIRATION_TIME = 28800;
@Autowired
private Environment env;
@Bean
public JedisConnectionFactory connectionFactory() {
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setHostName(env.getProperty("reddis.host"));
jedisConnectionFactory.setPort(env.getProperty("reddis.port", Integer.class));
return jedisConnectionFactory;
}
@Bean
public HttpSessionStrategy httpSessionStrategy() {
return new HeaderHttpSessionStrategy();
}
@Bean
public RedisOperationsSessionRepository sessionRepository() …Run Code Online (Sandbox Code Playgroud) 我在我的项目中使用带有 Redis 后端的 Spring Session 1.3.0。
我有一个用例,超级管理员可能会更新可能已经登录的现有用户的角色。我想在更改角色后删除这些用户的现有会话记录。
是否有 Spring Session 的 API 来归档它?
我在 Spring<form:password>标签中使用密码字段,如下所示,
<form:input path="extBtsBaseDto.extBtsRedmineConnectionDto.basicPassword"/>
Run Code Online (Sandbox Code Playgroud)
我正在使用它在作为许多其他屏幕一部分的屏幕中从用户那里获取密码。这些屏幕用作向导,我使用 Session 将值保存在我的主屏幕 DTO 上。我上面提到的密码是绑定在内部 DTO 中的。
问题:假设当我通过将数据从屏幕 A 提交到 B 进行导航时,我在屏幕 A 中有密码字段,我可以在 B 处获得密码,但在接下来的屏幕中它从 DTO 中消失了。
我可以通过用<form:password>普通的 HTML 标签替换 Spring标签来解决这个问题,但想知道为什么会发生这种情况,如果有任何解决方案,我想使用 Spring 标签。
如果有人想看我的代码,我可以分享。感谢您的时间。
我已经读过,会话违反了RESTfulness的概念.
由于微服务不可避免地使用REST,这同样适用吗?如果是这样,为什么我们有春季会议?它甚至列出了'Spring Session允许在头文件中提供会话ID以使用RESTfulAPI'作为其功能之一.
java spring-security spring-boot spring-session microservices
我使用 Spring 构建了一个 REST API 服务,其中我使用 MongoDB 启用了会话:
@Configuration
@EnableMongoHttpSession(maxInactiveIntervalInSeconds = Globals.SESSION_MAX_INTERVAL)
public class SessionConfig {
@Bean
public AbstractMongoSessionConverter createSessionConverterBean() {
return new JacksonMongoSessionConverter(Collections.singletonList(new GeoModule()));
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我想控制应该向哪些连接发出会话。目前,每个 HTTP 请求都会为其生成一个会话,但在某些情况下不需要该会话,我不希望将会话存储与永远不会使用的会话对象混在一起。
一个这样的场景是充当内容管理系统的独立桌面应用程序。此应用程序不需要 HTTP 会话,因为身份验证是通过应用程序端通过自定义授权标头完成的。此应用程序也仅从某个根路由映射访问端点:
公共交通路线api.domain.com/pub和 CMS 交通路线通过api.domain.com/cpi。
如果能够告诉 Spring 它不需要为任何请求创建会话,那就太好了/cpi。桌面应用程序还提供了一个独特的Origin,如果更容易完成,我也可以匹配。
我的网络安全看起来像这样:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest()
.permitAll()
.and()
.cors()
.and()
.httpBasic();
http.csrf().disable(); // Self-implemented
}
Run Code Online (Sandbox Code Playgroud)
我已经找遍了,没有找到任何东西。任何人都可以指出我正确的方向吗?
谢谢!
由于 Spring Security SAML 的问题,我们无法从 Spring session 1.3.3 升级到 2.1.2。似乎 Spring Security SAML 无法验证 InResponseToField 值,因为正在创建两个会话 ID:
Caused by: org.opensaml.common.SAMLException: InResponseToField of the Response doesn't correspond to sent message abc7b9acgecbde41927g729143f1g2
Run Code Online (Sandbox Code Playgroud)
我扩展了 SAMLContextProvider 使用的 HttpSessionStorageFactory 并添加了一些日志记录以了解发生了什么:
INFO 18.12.2018 13:43:27:95 (SAMLDelegatingAuthenticationEntryPoint.java:commence:105) - Session ID before redirect: 205e92ea-7ff3-45be-bfd1-648c2ae8da8e
INFO 18.12.2018 13:43:27:111 (SamlAuthenticationConfig.java:storeMessage:413) - Storing message abc7b9acgecbde41927g729143f1g2 to session 205e92ea-7ff3-45be-bfd1-648c2ae8da8e
Run Code Online (Sandbox Code Playgroud)
[用户现在被重定向到 IdP,然后被发送回应用程序]
现在出现以下错误:
Caused by: org.opensaml.common.SAMLException: InResponseToField of the Response doesn't correspond to sent message abc7b9acgecbde41927g729143f1g2
Run Code Online (Sandbox Code Playgroud)
这也是我们记录的内容:
INFO 18.12.2018 13:43:27:466 (SamlAuthenticationConfig.java:retrieveMessage:429) - Message abc7b9acgecbde41927g729143f1g2 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用在本地主机上破坏的 Redis 服务器来保存我的会话实例。当我启动应用程序时,我收到一条错误消息,应用程序无法启动。看起来类无法找到或 bean 错误,但我不太明白错误消息。
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 4.739 s <<< FAILURE! - in com.kb.webkb.WebkbApplicationTests
[ERROR] contextLoads(com.kb.webkb.WebkbApplicationTests) Time elapsed: 0.005 s <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'redisMessageListenerContainer' defined in class path resource [org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.class]: Unsatisfied dependency expressed through method 'redisMessageListenerContainer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'connectionFactory' defined in class path resource [com/kb/webkb/configuration/session/SessionConfig.class]: Bean instantiation via factory …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Spring Boot SAML2 + Spring Session 来保护我的 Web 应用程序(将部署在 K8S 上)。没有 spring-session-data-rest 或 spring-session-hazelcast 一切都很好。它可以通过 Okta 进行身份验证,并在身份验证后重定向回所请求的页面。另外,我可以使用 opensaml3 或 opensaml4。
但是,当我尝试使用 spring-session-data-rest 或 spring-session-hazelcast (只有 1 个实例,还没有集群)时,它不会重定向回请求的页面。此外,opensaml4 也会失败,并出现异常:“响应包含 InResponseTo 属性 [],但未找到已保存的身份验证请求”。有人提到 opensaml3 即将停产,所以我想让它与 opensaml4 一起使用。
这是一个示例应用程序来演示我的案例https://github.com/simonckw/redis-saml2/tree/redis。我错过了什么吗?有人有这个设置的工作样本吗?非常感谢您的帮助。
ps 我已经追踪到 HttpSessionRequestCache.java,从 SavedRequestAwareWarpper.java 调用。如果没有 spring-session-data-rest 或 spring-session-hazelcast,可以检索保存的请求,但在启用 spring-session-data-rest 或 spring-session-hazelcast 时则无法检索。在我看来,InResponseTo 异常也可能与之相关。我的 Redis 设置应该没问题。这是写入 Redis 的会话数据:
127.0.0.1:6379> hkeys 弹簧:会话:会话:7c1858d1-0ea7-4a7a-8523-2abf89137771
127.0.0.1:6379> hkeys 弹簧:会话:会话:58a584d3-625e-4e0a-bef5-3aaff485ad93
spring-security opensaml spring-saml spring-session spring-security-saml2
我已经尝试了官方参考Spring Session提供的示例。通过http:// localhost:8080 / login登录后,似乎会话数据仍存储在内存中,并且没有Redis交互(通过redis-cli monitor命令观察)。Cookie中仅存储JSESSIONID
以下设置:
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
spring.xml:
<context:annotation-config/>
<beans:bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
<beans:bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:hostName="192.168.1.230"
p:port="6379"
/>
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="root" password="123456" authorities="ROLE_ADMIN"/>
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
<security:global-method-security secured-annotations="enabled"/>
<security:http auto-config="true">
<security:intercept-url pattern="/ping" access="hasRole('ROLE_ADMIN')"/>
<security:form-login default-target-url="/ping"/>
<security:csrf disabled="true"/>
</security:http>
<mvc:annotation-driven/>
<context:component-scan base-package="io.hbprotoss.demo.controller"/>
Run Code Online (Sandbox Code Playgroud) 这是 Spring Boot 3.0.1 版本的问题。这对于 2.7.5 版本来说工作得非常好。
我的应用程序使用 Spring Security 和 JDBC 会话。所以我被X-Auth-Token保存在spring_session我的数据库(PostgreSQL)的表中。当我调用登录控制器方法时,我已经实现了UserDetailsService从数据库中获取用户的接口。
当迁移到新的 Spring Boot 3 版本时,主要的变化发生在WebSecurityConfig类中。以前它是从WebSecurityConfigurerAdapter班级延伸出来的。所以我知道问题出在这堂课的某个地方。
在这里,我复制并粘贴该类的旧版本 2.7.5(工作正常)和新的 3.0.1 版本WebSecurityConfig:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private RestAuthenticationEntryPoint restAuthenticationEntryPoint;
@Autowired
UserDetailsService userDetailsService;
@Autowired
private AuthenticationFailureHandler authenticationFailureHandler;
@Autowired
private PasswordEncoder passwordEncoder;
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected …Run Code Online (Sandbox Code Playgroud) spring-session ×10
spring ×6
spring-boot ×4
java ×3
redis ×2
spring-mvc ×2
jedis ×1
jsp ×1
opensaml ×1
saml ×1
spring-saml ×1