Spring Security - 多个会话取决于使用情况(login / httpBasic)

时间:2016-02-15 17:00:32

标签: java spring rest session spring-security

我有一个项目,我有一个应用程序“a”与休息服务和另一个(“b”)用于网页,用户可以登录并使用1或2个“a”的休息服务(例如发布一个注释)。
问题是,其余的服务都是安全的,每次都要通过httpBasic授权(没有会话) 另一方面,“b”所需的服务应有一个会话 所以:
直接请求其他服务 - > httpBasic每次(没有会话)
通过网页/网页处理请求登录 - >会话通过登录

有没有办法实现这个目标?我现在唯一的解决方案是在httpBasic进程之后删除会话,但我不知道该怎么做。

    httpSecurity.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
    .and()
    .authorizeRequests().anyRequest().permitAll()
    .and().httpBasic();

2 个答案:

答案 0 :(得分:0)

如果您真的希望删除会话数据,可以通过实现LogoutSuccessHandler接口来实现。

        package com.arjun.security;

        import java.io.IOException;

        import javax.servlet.ServletException;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;

        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.security.core.Authentication;
        import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
        import org.springframework.stereotype.Service;

        import com.informage.arnav.domain.CassandraLoginSession;

        @Service
        public class AppLogoutSuccessHandler implements LogoutSuccessHandler {

            @Autowired
            private CassandraLoginSessionDao cassandraLoginSessionDao;

            public AppLogoutSuccessHandler() {
                super();
            }

            @Override
            public void onLogoutSuccess(HttpServletRequest request,
                                        HttpServletResponse response,
                                        Authentication authentication) throws IOException, ServletException {

                if (authentication != null) {
                    final Object principal = authentication.getPrincipal();
                    final AppUserDetails appUserDetails;
                    if (principal != null && principal instanceof AppUserDetails) {
                        appUserDetails = (AppUserDetails) principal;
                CassandraLoginSession cassandraLoginSession=cassandraLoginSessionDao.findBySessionId(appUserDetails.getSessionId().toString());
            //can also delete based on userId                
            //CassandraLoginSession cassandraLoginSession=cassandraLoginSessionDao.findByUserId(appUserDetails.getUserId());
                        cassandraLoginSessionDao.hardDelete(cassandraLoginSession);
            //delete the session data from DB where session is stored
                    }
                }
            }

        } 

在您的安全配置中,您需要配置此处理程序。

<logout logout-url="/logout" success-handler-ref="appLogoutSuccessHandler" />

答案 1 :(得分:0)

您可以编写以下内容以允许在不登录的情况下访问您的Web服务:

http.authorizeRequests()    
    .antMatchers("/webserviceNotRequiredAuthorization*").permitAll();   

然后你必须写下你的webservices需要授权的以下内容:

http.authorizeRequests().antMatchers("/webserviceRequiredAuthorization").hasAnyRole("ROLE_ADMIN");

简而言之,首先编写不需要授权的URL模式,然后编写需要授权的URL模式。

http.authorizeRequests()    
    .antMatchers("/webserviceNotRequiredAuthorization*").permitAll();    

http.authorizeRequests().antMatchers("/webserviceRequiredAuthorization").hasAnyRole("ROLE_ADMIN");