Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 填充sessionRegistry和会话控制_Spring_Security_Model View Controller - Fatal编程技术网

Spring 填充sessionRegistry和会话控制

Spring 填充sessionRegistry和会话控制,spring,security,model-view-controller,Spring,Security,Model View Controller,大家晚上好。 我正在尝试建立一个简单的MVC站点,不使用xml配置,只使用java代码。 该网站有公共和私人内容,由spring security管理。 我不想吃饼干,所以我写了 public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { @Override protected Set<SessionTrackingMode> ge

大家晚上好。 我正在尝试建立一个简单的MVC站点,不使用xml配置,只使用java代码。 该网站有公共和私人内容,由spring security管理。 我不想吃饼干,所以我写了

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
    @Override
    protected Set<SessionTrackingMode> getSessionTrackingModes() {
        return EnumSet.of(SessionTrackingMode.SSL);
    }
}
在保安课上我有

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {


    @Autowired
    @Qualifier("customUserDetailsService")
    UserDetailsService userDetailsService;

    @Autowired
    private SessionRegistry sessionRegistry;

    @Autowired
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    ...
        ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry authorizeRequests = http.authorizeRequests();

        authorizeRequests.and()
          .sessionManagement()
            .maximumSessions(1) // How many session the same user can have? This can be any number you pick
            .maxSessionsPreventsLogin(true)
            .expiredUrl("/login?expired")
            .sessionRegistry(sessionRegistry);
    ...
如果我尝试访问

@Autowired
private SessionRegistry sessionRegistry;
始终为空(即使用户已登录且ssl会话似乎处于活动状态),并且会话数的安全检查失败

有什么建议吗

谢谢

正在进行(没有人在这段时间内回复过…) 我补充说

sessionRegistry已启动:),我在打开explorer和chrome时进行了第一次阳性测试(第二次登录被拒绝)

但是,当我尝试从chrome(或chrome的另一个实例)中的新窗口登录时,我能够在当前登录(共享同一会话)时进行两次登录,并且日志中有以下消息:

创建新会话时,servlet容器未更改会话ID。您将无法充分防止会话固定攻击

有什么想法吗

这是唯一的密码。。。 为了在我的场景中做我想做的事情(这可能不常见),我必须做一些不同的事情。。。 阅读代码时,我意识到我对会话固定一点也不感兴趣,我希望每个用户都有一个会话,如果请求另一个会话,这是一个安全问题或错误…所以我写道

@Bean(name = "sessionAuthenticationStrategy")
public SessionAuthenticationStrategy sessionAuthenticationStrategy(){
    List<SessionAuthenticationStrategy> delegateStrategies=new ArrayList<SessionAuthenticationStrategy>();
    ConcurrentSessionControlAuthenticationStrategy concurrent = new ConcurrentSessionControlAuthenticationStrategy(sessionRegistry);
    concurrent.setMaximumSessions(1);
    concurrent.setExceptionIfMaximumExceeded(true);
    delegateStrategies.add(concurrent);
    delegateStrategies.add(new SessionSingleUseProtectionStrategy(sessionRegistry));
    delegateStrategies.add(new RegisterSessionAuthenticationStrategy(sessionRegistry));
    return new CompositeSessionAuthenticationStrategy(delegateStrategies);
} 
@Bean(name=“sessionAuthenticationStrategy”)
公共会话身份验证策略会话身份验证策略(){
List delegateStrategies=new ArrayList();
ConcurrentSessionControlAuthenticationStrategy concurrent=新的ConcurrentSessionControlAuthenticationStrategy(会话注册表);
并发.setMaximumSessions(1);
concurrent.setExceptionIfmaximumExcepended(true);
授权策略。添加(并发);
delegateStrategies.add(新SessionSingleUseProtectionStrategy(sessionRegistry));
添加(新的RegisterSessionAuthenticationStrategy(sessionRegistry));
返回新的CompositeSessionAuthenticationStrategy(委派策略);
} 

这就是我要说的全部内容:)

实例化sessionRegistry实例时,它来自哪里

new ConcurrentSessionControlAuthenticationStrategy(sessionRegistry)
确保这与sessionRegistry()返回的实例相同(注意多次调用该方法将创建多个实例!)

此外,我没有看到任何sessionAuthenticationStrategy绑定到会话管理的代码:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.sessionManagement().sessionAuthenticationStrategy(sessionAuthenticationStrategy());
}
            SecurityContextHolder.getContext().setAuthentication(authentication);
            sessionAuthenticationStrategy.onAuthentication(authentication, request, response);
            return determineTargetUrl(authentication);
@Bean(name = "sessionAuthenticationStrategy")
public SessionAuthenticationStrategy sessionAuthenticationStrategy(){
    List<SessionAuthenticationStrategy> delegateStrategies=new ArrayList<SessionAuthenticationStrategy>();
    ConcurrentSessionControlAuthenticationStrategy concurrent = new ConcurrentSessionControlAuthenticationStrategy(sessionRegistry);
    concurrent.setMaximumSessions(1);
    concurrent.setExceptionIfMaximumExceeded(true);
    delegateStrategies.add(concurrent);
    delegateStrategies.add(new SessionSingleUseProtectionStrategy(sessionRegistry));
    delegateStrategies.add(new RegisterSessionAuthenticationStrategy(sessionRegistry));
    return new CompositeSessionAuthenticationStrategy(delegateStrategies);
} 
new ConcurrentSessionControlAuthenticationStrategy(sessionRegistry)
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.sessionManagement().sessionAuthenticationStrategy(sessionAuthenticationStrategy());
}