복붙노트

[SPRING] Google App Engine에서 봄 보안 구현

SPRING

Google 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. ==============================

    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 지원에 투표 할 수도 있습니다.

  2. from https://stackoverflow.com/questions/28869306/implement-spring-security-on-google-app-engine by cc-by-sa and MIT license