gpt4 book ai didi

spring-security - 如何使用Spring Session + Spring security xml配置和多重安全过滤器

转载 作者:行者123 更新时间:2023-12-04 07:00:11 28 4
gpt4 key购买 nike

背景
大家好,
我们有 Spring使用 Spring security 的项目.我们通过定义安全过滤器

 <b:bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
filter-chain-map并在 web.xml我们的确是
<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>
一切都很好:)。现在连接时 Spring sessionredis根据 doc接下来的几行
<context:annotation-config />
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
创建 filter命名 springSessionRepositoryFilter .所以基本上我们所做的是在每个自定义中 filter-chain我们将该过滤器添加为第一个过滤器。 IE:
<b:bean id="springSecurityFilterChain"   class="org.springframework.security.web.FilterChainProxy">
<filter-chain-map request-matcher="ant">

<filter-chain pattern="/api/someapieformobilelogin" filters="none" /> <!-- no filter on login -->
<filter-chain pattern="/api/**"
filters="springSessionRepositoryFilter, securityContextFilter,and some other spring security filter />

<filter-chain pattern="/**"
filters="springSessionRepositoryFilter, securityContextFilter,and some other spring security filter />

结果 :该应用程序似乎运行良好,而且 monitoring通过 redis-cli显示 spring正在与 redis 通信.
问题
是否使用 springSessionRepositoryFilterfilter-chain好吗?还是我们滥用了过滤系统?
谢谢,
橡木
编辑
似乎上面的方法不适用于想要 Authenticate 的情况。来自代码的用户,即
Authentication authentication = authenticationManager
.authenticate(authenticationToken);
SecurityContext securityContext = SecurityContextHolder
.getContext();
securityContext.setAuthentication(authentication);
会失败。也许是因为它不足以通过 filter-chain 运行它的 org.springframework.security.web.FilterChainProxy .
您认为如何将它运行为 filterweb.xml ?
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
以上将强制运行 springSessionRepositoryFilter之前 springSecurityFilterChain但在这个例子中 org.springframework.web.filter.DelegatingFilterProxy被调用两次。任何其他制作方法 springSessionRepositoryFilter在退出之前作为过滤器运行 springSecurityFilterChain筛选?

最佳答案

根据我的测试,springSessionRepositoryFilter必须先运行。这是因为 springSessionRepositoryFilter替换 HttpSession执行。这是我使用 xml 的解决方案文件。

redis-cache.xml

<context:annotation-config />
<bean
class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" />

<bean
class="org.springframework.security.web.session.HttpSessionEventPublisher" />

<!-- end of seesion managment configuration -->


<bean id="redisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="port" value="${app.redis.port}" />
<property name="hostName" value="${app.redis.hostname}" />
<property name="password" value="${app.redis.password}" />
<property name="usePool" value="true" />
</bean>

We use the combination of and RedisHttpSessionConfiguration because Spring Session does not yet provide XML Namespace support (see gh-104). This creates a Spring Bean with the name of springSessionRepositoryFilter that implements Filter. The filter is what is in charge of replacing the HttpSession implementation to be backed by Spring Session. In this instance Spring Session is backed by Redis. source



现在,我们有了 session filter命名 springSessionRepositoryFilter它必须作为第一个过滤器运行,因为它取代了 HttpSession执行。

为此,我们将其声明为 web.xml 中的第一个过滤器。 .有关过滤器和过滤器订单的更多信息,请查看 docs

网页.xml
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>


<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/redis-cache.xml
</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

注意第一个运行的是 springSessionRepositoryFilter .但实际上 org.springframework.web.filter.DelegatingFilterProxy类正在运行,它会按 bean 的名称查找过滤器。所以它搜索我们早期配置创建的 bean。
reference

关于 redis-cache.xml 的额外行也很重要。否则我们的 spring application context不知道我们的 redis 配置

reference

关于spring-security - 如何使用Spring Session + Spring security xml配置和多重安全过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32459402/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com