복붙노트

[SPRING] Spring에서 Session 객체를 얻으려면 어떻게해야합니까?

SPRING

Spring에서 Session 객체를 얻으려면 어떻게해야합니까?

나는 봄과 봄 보안에 비교적 새로운 것이다.

스프링 보안을 사용하여 서버 측에서 사용자를 인증해야하는 프로그램을 작성하려고 시도했지만,

나는 다음을 생각해 냈다 :

public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider{
    @Override
    protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken)
                    throws AuthenticationException
    {
        System.out.println("Method invoked : additionalAuthenticationChecks isAuthenticated ? :"+usernamePasswordAuthenticationToken.isAuthenticated());
    }

    @Override
    protected UserDetails retrieveUser(String username,UsernamePasswordAuthenticationToken authentication) throws AuthenticationException 
    {
        System.out.println("Method invoked : retrieveUser");
        //so far so good, i can authenticate user here, and throw exception if not authenticated!!
        //THIS IS WHERE I WANT TO ACCESS SESSION OBJECT
    }
}

내 유스 케이스는 사용자가 인증 될 때 다음과 같은 속성을 배치해야한다는 것입니다.

session.setAttribute("userObject", myUserObject);

myUserObject는 여러 사용자 요청에서 서버 코드 전체에서 액세스 할 수있는 일부 클래스의 객체입니다.

해결법

  1. ==============================

    1.친구는 org.springframework.web.context.request.RequestContextHolder입니다.

    친구는 org.springframework.web.context.request.RequestContextHolder입니다.

    // example usage
    public static HttpSession session() {
        ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
        return attr.getRequest().getSession(true); // true == allow create
    }
    

    이것은 표준 스프링 mvc 디스패치 서블릿에 의해 채워지지만 다른 웹 프레임 워크를 사용한다면 org.springframework.web.filter.RequestContextFilter를 web.xml의 필터로 추가하여 홀더를 ​​관리하십시오.

    편집 : 그냥 측면 문제로 당신이 실제로하려고하는, 나는 당신이 UserDetailsService의 retieveUser 메서드에서 HttpSession에 대한 액세스 권한이 필요할지 모르겠다. Spring 보안은 UserDetails 객체를 세션에 넣을 것이다. SecurityContextHolder에 액세스하여 검색 할 수 있습니다.

    public static UserDetails currentUserDetails(){
        SecurityContext securityContext = SecurityContextHolder.getContext();
        Authentication authentication = securityContext.getAuthentication();
        if (authentication != null) {
            Object principal = authentication.getPrincipal();
            return principal instanceof UserDetails ? (UserDetails) principal : null;
        }
        return null;
    }
    
  2. ==============================

    2.당신이 봄을 사용하고 있기 때문에, 봄과 함께, 다른 포스트 posits처럼 그것을 해킹하지 마십시오.

    당신이 봄을 사용하고 있기 때문에, 봄과 함께, 다른 포스트 posits처럼 그것을 해킹하지 마십시오.

    스프링 매뉴얼에 의하면 :

    세션에 액세스하기 위해 권장되는 최선의 방법은 다음과 같습니다.

    Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    
    if (principal instanceof UserDetails) {
      String username = ((UserDetails)principal).getUsername();
    } else {
      String username = principal.toString();
    }
    

    여기 핵심은 Spring과 Spring Security가 Session Fixation Prevention과 같은 모든 종류의 훌륭한 것들을 수행한다는 것입니다. 이러한 것들은 스프링 프레임 워크가 사용되도록 고안된대로 사용하고 있다고 가정합니다. 따라서 서블릿에서 컨텍스트를 인식하고 위의 예제와 같이 세션에 액세스하십시오.

    세션 범위에 일부 데이터를 숨겨두기 만하면이 예제와 같이 세션 범위가 지정된 일부 bean을 작성하고 autowire가 마술을하도록하십시오. :)

  3. ==============================

    3.실제로 다음을 수행하여 HttpSessionListener에서 세션이 삭제되는 경우에도 세션의 정보에 액세스 할 수 있습니다.

    실제로 다음을 수행하여 HttpSessionListener에서 세션이 삭제되는 경우에도 세션의 정보에 액세스 할 수 있습니다.

    public void sessionDestroyed(HttpSessionEvent hse) {
        SecurityContextImpl sci = (SecurityContextImpl) hse.getSession().getAttribute("SPRING_SECURITY_CONTEXT");
        // be sure to check is not null since for users who just get into the home page but never get authenticated it will be
        if (sci != null) {
            UserDetails cud = (UserDetails) sci.getAuthentication().getPrincipal();
            // do whatever you need here with the UserDetails
        }
     }
    

    또는 다음과 같이 HttpSession 객체를 사용할 수있는 곳이라면 어디서나 정보에 액세스 할 수 있습니다.

    SecurityContextImpl sci = (SecurityContextImpl) session().getAttribute("SPRING_SECURITY_CONTEXT");
    

    마지막으로 다음과 같이 가정합니다.

    HttpSession sesssion = ...; // can come from request.getSession(false);
    
  4. ==============================

    4.나는 내 자신의 유틸리티를 만들었다. 그것은 편리합니다. :)

    나는 내 자신의 유틸리티를 만들었다. 그것은 편리합니다. :)

    package samples.utils;
    
    import java.util.Arrays;
    import java.util.Collection;
    import java.util.Locale;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import javax.sql.DataSource;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.NoSuchBeanDefinitionException;
    import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationEventPublisher;
    import org.springframework.context.MessageSource;
    import org.springframework.core.convert.ConversionService;
    import org.springframework.core.io.ResourceLoader;
    import org.springframework.core.io.support.ResourcePatternResolver;
    import org.springframework.ui.context.Theme;
    import org.springframework.util.ClassUtils;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    import org.springframework.web.context.support.WebApplicationContextUtils;
    import org.springframework.web.servlet.LocaleResolver;
    import org.springframework.web.servlet.ThemeResolver;
    import org.springframework.web.servlet.support.RequestContextUtils;
    
    
    /**
     * SpringMVC通用工具
     * 
     * @author 应卓(yingzhor@gmail.com)
     *
     */
    public final class WebContextHolder {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(WebContextHolder.class);
    
        private static WebContextHolder INSTANCE = new WebContextHolder();
    
        public WebContextHolder get() {
            return INSTANCE;
        }
    
        private WebContextHolder() {
            super();
        }
    
        // --------------------------------------------------------------------------------------------------------------
    
        public HttpServletRequest getRequest() {
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
            return attributes.getRequest();
        }
    
        public HttpSession getSession() {
            return getSession(true);
        }
    
        public HttpSession getSession(boolean create) {
            return getRequest().getSession(create);
        }
    
        public String getSessionId() {
            return getSession().getId();
        }
    
        public ServletContext getServletContext() {
            return getSession().getServletContext();    // servlet2.3
        }
    
        public Locale getLocale() {
            return RequestContextUtils.getLocale(getRequest());
        }
    
        public Theme getTheme() {
            return RequestContextUtils.getTheme(getRequest());
        }
    
        public ApplicationContext getApplicationContext() {
            return WebApplicationContextUtils.getWebApplicationContext(getServletContext());
        }
    
        public ApplicationEventPublisher getApplicationEventPublisher() {
            return (ApplicationEventPublisher) getApplicationContext();
        }
    
        public LocaleResolver getLocaleResolver() {
            return RequestContextUtils.getLocaleResolver(getRequest());
        }
    
        public ThemeResolver getThemeResolver() {
            return RequestContextUtils.getThemeResolver(getRequest());
        }
    
        public ResourceLoader getResourceLoader() {
            return (ResourceLoader) getApplicationContext();
        }
    
        public ResourcePatternResolver getResourcePatternResolver() {
            return (ResourcePatternResolver) getApplicationContext();
        }
    
        public MessageSource getMessageSource() {
            return (MessageSource) getApplicationContext();
        }
    
        public ConversionService getConversionService() {
            return getBeanFromApplicationContext(ConversionService.class);
        }
    
        public DataSource getDataSource() {
            return getBeanFromApplicationContext(DataSource.class);
        }
    
        public Collection<String> getActiveProfiles() {
            return Arrays.asList(getApplicationContext().getEnvironment().getActiveProfiles());
        }
    
        public ClassLoader getBeanClassLoader() {
            return ClassUtils.getDefaultClassLoader();
        }
    
        private <T> T getBeanFromApplicationContext(Class<T> requiredType) {
            try {
                return getApplicationContext().getBean(requiredType);
            } catch (NoUniqueBeanDefinitionException e) {
                LOGGER.error(e.getMessage(), e);
                throw e;
            } catch (NoSuchBeanDefinitionException e) {
                LOGGER.warn(e.getMessage());
                return null;
            }
        }
    
    }
    
  5. ==============================

    5.나는 다음 코드로 노력하고 뛰어나다.

    나는 다음 코드로 노력하고 뛰어나다.

        import org.springframework.security.core.Authentication;
        import org.springframework.security.core.context.SecurityContextHolder;
        import org.springframework.stereotype.Controller;
        import org.springframework.ui.ModelMap;
        import org.springframework.web.bind.annotation.RequestMapping;
        import org.springframework.web.bind.annotation.RequestMethod;
    
        /**
         * Created by jaime on 14/01/15.
         */
    
        @Controller
        public class obteinUserSession {
            @RequestMapping(value = "/loginds", method = RequestMethod.GET)
            public String UserSession(ModelMap modelMap) {
                Authentication auth = SecurityContextHolder.getContext().getAuthentication();
                String name = auth.getName();
                modelMap.addAttribute("username", name);
                return "hellos " + name;
            }
    
  6. ==============================

    6.필요한 모든 것이 User의 세부 사항이라면, Spring Version 4.x에서는 Spring에서 제공하는 @AuthenticationPrincipal과 @EnableWebSecurity 태그를 아래와 같이 사용할 수 있습니다.

    필요한 모든 것이 User의 세부 사항이라면, Spring Version 4.x에서는 Spring에서 제공하는 @AuthenticationPrincipal과 @EnableWebSecurity 태그를 아래와 같이 사용할 수 있습니다.

    보안 구성 클래스 :

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
       ...
    }
    

    컨트롤러 방법 :

    @RequestMapping("/messages/inbox")
    public ModelAndView findMessagesForUser(@AuthenticationPrincipal User user) {
        ...
    }
    
  7. from https://stackoverflow.com/questions/1629211/how-do-i-get-the-session-object-in-spring by cc-by-sa and MIT license