[SPRING] Google App Engine에서 봄 보안 구현
SPRINGGoogle App Engine에서 봄 보안 구현
Google Apps 엔진에서 봄 보안을 통합하려고합니다. 하지만 제대로 작동하지 않습니다. 나는 그들이 인덱스 페이지에 액세스하려고 할 때 사용자를 인증하고 로그인 페이지로 리다이렉트했다. 하지만 이제 색인 페이지를 직접 방문 할 수 있습니다.
나는 spring.io 웹 사이트 튜토리얼과 mkyong 튜토리얼을 따랐다.
여기 내 pom.xml 종속성의 일부입니다.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.webflow</groupId>
<artifactId>spring-webflow</artifactId>
<version>2.4.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>3.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>3.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
AppConfig 클래스
@EnableWebMvc
@Configuration
//@ComponentScan({ "com.example.web.*" })
@ComponentScan({ "com.example.web" })
@Import({ SecurityConfig.class })
public class AppConfig {
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
SecurityConfig 클래스
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.inMemoryAuthentication().withUser("user").password("password")
.roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated().and().formLogin()
.loginPage("/account/login");
}
}
SecurityWebApplicationInitializer 클래스
public class SecurityWebApplicationInitializer extends
AbstractSecurityWebApplicationInitializer {
}
WebApplicationInitializer 클래스
public class WebApplicationInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { AppConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
AccountController 클래스
@Controller
@RequestMapping("/account")
public class AccountController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String Index(Model model) {
return "login";
}
}
HomeController 클래스
@제어 장치 @RequestMapping ( "/") 공용 클래스 HomeController {
@RequestMapping(method = RequestMethod.GET)
public String Index(Model model) {
model.addAttribute("x", 1);
model.addAttribute("y", 2);
model.addAttribute("z", 3);
return "index";
}
index.jsp 페이지
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page session="true"%>
<!DOCTYPE html>
.....
login.jsp 페이지
<%@page session="false"%>
<!DOCTYPE html>
이제는 인증되지 않은 사용자를 로그인 페이지로 리디렉션하려고합니다. 하지만 지금은 작동하지 않습니다, 나는 직접 홈페이지를 방문 할 수 있습니다.
해결법
-
==============================
1.WebApplicationInitializer는 Servlet 3.0이 필요하지만 Appengine은 Servlet 2.5 만 지원합니다. 따라서 적어도 초기화를 위해서는 일반 XML 기반 구성을 사용해야합니다. 그리고 web.xml에서 스프링 필터 / 서블릿을 수동으로 설정하십시오.
WebApplicationInitializer는 Servlet 3.0이 필요하지만 Appengine은 Servlet 2.5 만 지원합니다. 따라서 적어도 초기화를 위해서는 일반 XML 기반 구성을 사용해야합니다. 그리고 web.xml에서 스프링 필터 / 서블릿을 수동으로 설정하십시오.
web.xml에 넣어야합니다.
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-security.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>spring-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> <init-param> <param-name>contextClass</param-name> <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> </init-param> <init-param> <param-name>contextConfigLocation</param-name> <param-value>path.to.AppConfig</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>spring-dispatcher</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
및 spring-security.xml :
<context:annotation-config/> <beans:bean class="path.to.SecurityConfig"/>
기본적으로 서블릿 3.0 이전의 모든 표준 도구이며 서블릿 2.4 또는 2.5를 기반으로하는 자습서 (또는 오래된 문서)를 사용할 수 있으며 Appengine에서 작동합니다.
추신 : https://code.google.com/p/googleappengine/issues/detail?id=3091에서 Servlet 3.0 지원에 투표 할 수도 있습니다.
from https://stackoverflow.com/questions/28869306/implement-spring-security-on-google-app-engine by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 405 POST에 허용되지 않는 메소드 (0) | 2019.05.11 |
---|---|
[SPRING] spring-data-redis redisTemplate 예외 (0) | 2019.05.11 |
[SPRING] Spring 프로파일을 패키지로 설정하는 방법은? (0) | 2019.05.11 |
[SPRING] JPA와 Hibernate로 SQL 함수 등록하기 (0) | 2019.05.11 |
[SPRING] 400 Hibernate @Valid가있는 잘못된 요청 (0) | 2019.05.11 |