这条链子上的一个链子。这是我(在科特林)想到的,对我很有用: @EnableWebSecurity class SecurityConfig() { private val sessionStore = ConcurrentHashMap<String, Session>() private val sessionRepo = MapSessionRepository(sessionStore) @Configuration @Order(1) inner class XAuthConfig(): WebSecurityConfigurerAdapter() { override fun configure(http: HttpSecurity) { http .requestMatchers() .antMatchers("/api**") .and() .addFilterBefore( SessionRepositoryFilter(sessionRepo).apply{ setHttpSessionIdResolver( HeaderHttpSessionIdResolver.xAuthToken(); ) }, WebAsyncManagerIntegrationFilter::class.java) } } @Configuration @Order(2) inner class DefaultConfig(): WebSecurityConfigurerAdapter() { override fun configure(http: HttpSecurity) { http .addFilterBefore( SessionRepositoryFilter(sessionRepo).apply{ setHttpSessionIdResolver( CookieHttpSessionIdResolver() ) }, WebAsyncManagerIntegrationFilter::class.java) } } } } @EnableWebSecurity 类SecurityConfig(){ private val sessionStore=ConcurrentHashMap() private val sessionRepo=MapSessionRepository(sessionStore) @配置 @订单(1) 内部类XAuthConfig():WebSecurityConfigureAdapter(){ 覆盖配置(http:HttpSecurity){ http .requestMatchers() .antMatchers(“/api**”) .及() .addFilterBefore( SessionRepositoryFilter(sessionRepo).应用{ SetHttpSessiondResolver( HeaderHttpSessionIdResolver.xAuthToken(); ) },WebAsyncManagerIntegrationFilter::class.java) } } @配置 @订单(2) 内部类DefaultConfig():WebSecurityConfigureAdapter(){ 覆盖配置(http:HttpSecurity){ http .addFilterBefore( SessionRepositoryFilter(sessionRepo).应用{ SetHttpSessiondResolver( CookieHttpSessionIdResolver() ) },WebAsyncManagerIntegrationFilter::class.java) } } } }

这条链子上的一个链子。这是我(在科特林)想到的,对我很有用: @EnableWebSecurity class SecurityConfig() { private val sessionStore = ConcurrentHashMap<String, Session>() private val sessionRepo = MapSessionRepository(sessionStore) @Configuration @Order(1) inner class XAuthConfig(): WebSecurityConfigurerAdapter() { override fun configure(http: HttpSecurity) { http .requestMatchers() .antMatchers("/api**") .and() .addFilterBefore( SessionRepositoryFilter(sessionRepo).apply{ setHttpSessionIdResolver( HeaderHttpSessionIdResolver.xAuthToken(); ) }, WebAsyncManagerIntegrationFilter::class.java) } } @Configuration @Order(2) inner class DefaultConfig(): WebSecurityConfigurerAdapter() { override fun configure(http: HttpSecurity) { http .addFilterBefore( SessionRepositoryFilter(sessionRepo).apply{ setHttpSessionIdResolver( CookieHttpSessionIdResolver() ) }, WebAsyncManagerIntegrationFilter::class.java) } } } } @EnableWebSecurity 类SecurityConfig(){ private val sessionStore=ConcurrentHashMap() private val sessionRepo=MapSessionRepository(sessionStore) @配置 @订单(1) 内部类XAuthConfig():WebSecurityConfigureAdapter(){ 覆盖配置(http:HttpSecurity){ http .requestMatchers() .antMatchers(“/api**”) .及() .addFilterBefore( SessionRepositoryFilter(sessionRepo).应用{ SetHttpSessiondResolver( HeaderHttpSessionIdResolver.xAuthToken(); ) },WebAsyncManagerIntegrationFilter::class.java) } } @配置 @订单(2) 内部类DefaultConfig():WebSecurityConfigureAdapter(){ 覆盖配置(http:HttpSecurity){ http .addFilterBefore( SessionRepositoryFilter(sessionRepo).应用{ SetHttpSessiondResolver( CookieHttpSessionIdResolver() ) },WebAsyncManagerIntegrationFilter::class.java) } } } },java,spring,spring-security,Java,Spring,Spring Security,注意注释@EnableSpringHttpSession已被删除。相反,我们在WebAsyncManagerIntegrationFilters(安全过滤器链中的第一个过滤器)之前手动添加SessionRepositoryFilters。SessionRepositoryFilter的功能是将现有的HttpSession替换为Spring的HttpSession,无论我们手动放置还是通过自动配置自动放置,它都会这样做。只要在安全过滤器链使用会话之前没有其他过滤器,这应该是可行的。否则,一些过滤器

注意注释
@EnableSpringHttpSession
已被删除。相反,我们在
WebAsyncManagerIntegrationFilter
s(安全过滤器链中的第一个过滤器)之前手动添加
SessionRepositoryFilter
s。
SessionRepositoryFilter
的功能是将现有的
HttpSession
替换为Spring的
HttpSession
,无论我们手动放置还是通过自动配置自动放置,它都会这样做。只要在安全过滤器链使用会话之前没有其他过滤器,这应该是可行的。否则,一些过滤器的重新排列可能仍然会起作用。

这听起来像是一个错误。您试图以这种方式解决的原始问题是什么?为什么需要使用一个或两个不同的解析器来处理/api?如果您已经使用了Spring安全性,您是否考虑过角色,并使用这种方法来解决问题?例如http.authorizeRequests().antMatchers(“/admin”).hasRole(“admin”).antMatchers(“/api”).hasRole(“用户”).anyRequest().authorized()和().formLogin();这只是一种方式。您还可以为每个控制器方法设置@RoleAllowed({“USER”,“ADMIN”}),这样就可以控制不同角色的访问权限。@m4gic:我想我的主要问题可以从第一句猜出来,但也许您是对的,这还不够清楚:有两种类型的客户端希望从我的后端获取数据。对于第一组(例如,为我处理cookie的浏览器),如果要使用cookie。对于第二组(例如android应用程序),我想使用一个额外的身份验证头,不使用cookies,这样我就可以通过令牌来启用CSRF保护。@mommcilo:请参阅我的说明。我会同时使用这两种方法:从后端的角度来看,关键是您的用户必须以任何方式对其自身进行身份验证。因此,不要试图分离这些类型的请求,您应该让它们以任何方式进行身份验证,如果它们包含cookie,您应该为它们提供服务,同样,如果它们有一个auth头,您也应该为它们提供服务。例如,在WebLogic中,有一种类似的机制,其中JAAS登录模块是足够的,这意味着它们中的任何一个都可以对用户进行身份验证,请求可以被服务,否则显然不能。我可以添加对请求的URL前缀的检查,而不是确保相应的身份验证机制。但这也不好。他们没有办法在分离的WebSecurity配置适配器中定义这一点吗?这是两个分离的筛选器链,因此我希望能够轻松地提供不同的会话解析程序。很抱歉稍后给出答案。这就是我一直在寻找的解决方案。作品完美,谢谢!
public class SmartHttpSessionIdResolver implements HttpSessionIdResolver {

    private static final String HEADER_X_AUTH_TOKEN = "X-Auth-Token";
    private static final CookieHttpSessionIdResolver cookie = new CookieHttpSessionIdResolver();
    private static final HeaderHttpSessionIdResolver xauth = HeaderHttpSessionIdResolver.xAuthToken();

    @Override
    public List<String> resolveSessionIds(HttpServletRequest request) {
        if (isXAuth(request)) {
            return xauth.resolveSessionIds(request);
        }
        return cookie.resolveSessionIds(request);
    }

    @Override
    public void setSessionId(HttpServletRequest request, HttpServletResponse response, String sessionId) {
        if (isXAuth(request)) {
            xauth.setSessionId(request, response, sessionId);
        } else {
            cookie.setSessionId(request, response, sessionId);
        }
    }

    @Override
    public void expireSession(HttpServletRequest request, HttpServletResponse response) {
        if (isXAuth(request)) {
            xauth.expireSession(request, response);
        } else {
            cookie.expireSession(request, response);
        }
    }

    private boolean isXAuth(HttpServletRequest request) {
        return request.getHeader(HEADER_X_AUTH_TOKEN) != null;
    }
}
@EnableWebSecurity
class SecurityConfig() {

    private val sessionStore = ConcurrentHashMap<String, Session>()
    private val sessionRepo = MapSessionRepository(sessionStore)

    @Configuration
    @Order(1)
    inner class XAuthConfig(): WebSecurityConfigurerAdapter() {

        override fun configure(http: HttpSecurity) {
            http
                .requestMatchers()
                    .antMatchers("/api**")
                    .and()
                .addFilterBefore(
                    SessionRepositoryFilter(sessionRepo).apply{
                        setHttpSessionIdResolver(
                            HeaderHttpSessionIdResolver.xAuthToken();
                        )
                    }, WebAsyncManagerIntegrationFilter::class.java)
        }
    }

    @Configuration
    @Order(2)
    inner class DefaultConfig(): WebSecurityConfigurerAdapter() {

        override fun configure(http: HttpSecurity) {
            http
                .addFilterBefore(
                    SessionRepositoryFilter(sessionRepo).apply{
                        setHttpSessionIdResolver(
                            CookieHttpSessionIdResolver()
                        )
                    }, WebAsyncManagerIntegrationFilter::class.java)
            }
        }
    }

}