Session Object를 봄에 가져오려면 어떻게 해야 하나요?
저는 춘계 보안에 비교적 익숙하지 않습니다.
Spring 보안을 사용하여 서버 측에서 사용자를 인증해야 하는 프로그램을 작성하려고 했습니다.
저는 다음과 같은 것을 생각해 냈습니다.
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는 여러 사용자 요청을 통해 서버 코드를 통해 액세스할 수 있는 일부 클래스의 개체입니다.
여기 네 친구는
// example usage
public static HttpSession session() {
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
return attr.getRequest().getSession(true); // true == allow create
}
이 값은 표준 spring mvc dispatch servlet에 의해 입력되지만 다른 웹 프레임워크를 사용하는 경우 추가가 필요합니다.org.springframework.web.filter.RequestContextFilter
필터로서web.xml
홀더를 관리합니다.
편집: 실제로 무엇을 하려고 하는지 부수적인 문제이지만,HttpSession
에서retieveUser
의 방법UserDetailsService
. Spring 보안은 User Details 개체를 세션에 추가합니다.에 액세스 하면, 취득할 수 있습니다.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;
}
스프링을 사용하는 이상 스프링을 계속 사용하세요. 다른 포스트 포즈처럼 스스로 해킹하지 마세요.
보안을 위해 HttpSession과 직접 대화해서는 안 됩니다.그럴 이유가 없습니다.대신 Security Context Holder를 사용하십시오.
세션에 액세스하기 위한 권장 베스트 프랙티스는 다음과 같습니다.
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
String username = ((UserDetails)principal).getUsername();
} else {
String username = principal.toString();
}
여기서 중요한 점은 Spring and Spring Security가 Session Fixion Prevention과 같은 모든 종류의 훌륭한 기능을 제공한다는 것입니다.이는 스프링 프레임워크를 사용하도록 설계된 대로 사용하고 있다고 가정합니다.따라서 서블릿에서 위의 예와 같이 컨텍스트를 인식하고 세션에 액세스합니다.
세션 범위에 데이터를 저장해야 하는 경우 이 예시와 같이 세션 범위 내의 빈을 생성하여 자동 배선이 기능을 수행하도록 하십시오.:)
내가 직접 이용했어그것은 편리하다.:)
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;
}
}
}
실제로 HttpSessionLisener에서 세션이 파기되어 있는 경우에도 세션에서 정보에 액세스할 수 있습니다.
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);
다음 코드로 시도하면 훌륭하게 동작합니다.
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;
}
시나리오에서는 커스텀에 HttpSession을 삽입했습니다.Authentication Provider 클래스는 다음과 같습니다.
public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider{
@Autowired
private HttpSession httpSession;
@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
httpSession.setAttribute("userObject", myUserObject);
}
}
사용자 상세 정보만 필요한 경우 Spring 버전 4.x 를 사용할 수 있습니다.@AuthenticationPrincipal
★★★★★★★★★★★★★★★★★」@EnableWebSecurity
아래 그림과 같이 스프링에서 제공하는 태그.
보안 구성 클래스:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
...
}
컨트롤러 방식:
@RequestMapping("/messages/inbox")
public ModelAndView findMessagesForUser(@AuthenticationPrincipal User user) {
...
}
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
attr.getSessionId();
언급URL : https://stackoverflow.com/questions/1629211/how-do-i-get-the-session-object-in-spring
'programing' 카테고리의 다른 글
빈 필드를 사용하여 AngularJS 오더바이 (0) | 2023.02.27 |
---|---|
MongoDB는 어레이를 어떻게 인덱스합니까? (0) | 2023.02.27 |
Oracle: 타임스탬프에 분을 추가하는 방법 (0) | 2023.02.27 |
wordpress the_content parse outside 루프 (0) | 2023.02.27 |
Angular.js ng-change 이벤트에서 체크박스가 켜져 있는지 여부를 검출합니다. (0) | 2023.02.27 |