7、Spring Session-Spring Security集成

6、Spring Security集成

Spring Session提供了和Spring Security的集成。

6.1. Spring Security Remember-Me的支持

Spring Session 提供了和 Spring Security’s Remember-Me Authentication(https://docs.spring.io/spring-security/site/docs/4.2.x/reference/htmlsingle/#remember-me)的支持。这个支持将会带来:

  1. 改变会话过期长度
  2. 确保会话的Cookie过期时限为Integer.MAX_VALUE。Cookie过期设置为最大的可能值是因为cookie是在会话创建的时候设置。如果它被设置成和session过期一样的话,当用户使用session时session可以更新,但是cookie过期之后不会更新,从而将会导致过期而被限定。

使用Java配置Spring Session和Spring Security参考如下:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        // ... additional configuration ...
        .rememberMe()
            .rememberMeServices(rememberMeServices());
}

@Bean
RememberMeServices rememberMeServices() {
    SpringSessionRememberMeServices rememberMeServices =
            new SpringSessionRememberMeServices();
    // optionally customize
    rememberMeServices.setAlwaysRemember(true);
    return rememberMeServices;
}

基于XML配置如下:

<security:http>
    <!-- ... -->
    <security:form-login />
    <security:remember-me services-ref="rememberMeServices"/>
</security:http>

<bean id="rememberMeServices"
    class="org.springframework.session.security.web.authentication.SpringSessionRememberMeServices" p:alwaysRemember="true"/>

6.2. Spring Security并发会话控制

Spring Session提供了和Spring Security的整合支持并发会话控制。这允许限制单个用户可以并发的活跃会话数量。但是这和默认Spring Security支持的不同,这个可以在集群环境中使用。它是通过提供Spring Security的SessionRegistry接口的一个个性化实现来完成的。

当我们使用Spring Security Java配置DSL时,你可以就像下面一样通过SessionManagementConfigurer来配置个性化的SessionRegistry。

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private FindByIndexNameSessionRepository<Session> sessionRepository;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http
            // other config goes here...
            .sessionManagement()
                .maximumSessions(2)
                .sessionRegistry(sessionRegistry());
        // @formatter:on
    }

    @Bean
    SpringSessionBackedSessionRegistry sessionRegistry() {
        return new SpringSessionBackedSessionRegistry<>(this.sessionRepository);
    }
}

这里假设你已经配置了Spring Session并提供了一个FindByIndexNameSessionRepository返回Session实例。

使用XML配置如下:

<security:http>
    <!-- other config goes here... -->
    <security:session-management>
        <security:concurrency-control max-sessions="2" session-registry-ref="sessionRegistry"/>
    </security:session-management>
</security:http>

<bean id="sessionRegistry"
      class="org.springframework.session.security.SpringSessionBackedSessionRegistry">
    <constructor-arg ref="sessionRepository"/>
</bean>

这里假设称为sessionRegistry是你的Spring Session SessionRegistry,这个名称将会被所有的SpringHttpSessionConfiguration的子类所使用。

6.3. 局限性

Spring Security’s SessionRegistry接口的Spring Session实现不支持getAllPrincipals方法,因此这些信息就不能使用Spring Session获取。这个方法也不会被Spring Security调用,因此这仅仅影响那些访问SessionRegistry 自己的应用。

原文:https://docs.spring.io/spring-session/docs/2.0.0.M4/reference/html5/#spring-security

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值